home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 015 / proset.arc / PRO-SET.ASM next >
Assembly Source File  |  1988-03-24  |  49KB  |  2,552 lines

  1. ;        ***************************************
  2. ;        *  Program:  PRO-SET.ASM              *
  3. ;        *  Purpose:  To configure the IBM     *
  4. ;        *            PROPRINTER to individual *
  5. ;        *            requirements             *
  6. ;        *  Author:   Fred Willshaw          *
  7. ;        *         CIS 73075,321            *
  8. ;        *  Date:     March 25, 1988           *
  9. ;        *  Version:  3.5               *
  10. ;        ***************************************
  11.  
  12. CODE        SEGMENT PARA
  13.  
  14.         ORG    100H                ;FOR EXE2BIN
  15.  
  16.         ASSUME    CS:CODE,DS:NOTHING,ES:NOTHING
  17.  
  18. PROSET:        JMP    START                ;JUMP TO INSTALL
  19.  
  20. ACTIVE_PRINTER    DW    0
  21. ASCIIZ         DB    128 DUP (0)
  22. BUFFER        DB    264 DUP (' ')
  23. COLOR_1        DB    1FH
  24. COLOR_2        DB    9FH
  25. COLOR_3        DB    4FH
  26. COLOR_4        DB    2FH
  27. COLOR_5        DB    0AFH
  28. COLOR_6        DB    5FH
  29. COLOR_7        DB    0DFH
  30. COLOR_8        DB    3FH
  31. COLOR_REQUEST    DB    'C'
  32. COLUMN        DB    0
  33. CUR_COLOR_1    DB    0
  34. CUR_COLOR_2    DB    0
  35. FONTGEN_PREFIX    DB    27,'=',198,4,20,33
  36. FONTREG_PREFIX    DB    27,'=',15,0,20,0,0,0
  37. FONT_CHARACTER    DB    248,160,160,142,129,1,6,1,1,14,0
  38. FONT_CTR    DW    0
  39. FONT_TYPE    DB    0
  40. FORMS_BUFFER    DB    '   '
  41. HANDLE        DW    0
  42. INSERT        DB    ' '
  43. LINE        DB    0
  44. LOAD_FLAG    DB    '½¼-'
  45. LOAD_MSG    DB    '  LOADING  '
  46. KBFLAG        DB    0CH
  47. KBOARD_VECTOR    DD    0            ;OLD INT 09H ADDRESS
  48. MONO        DB    'N'
  49. PRINTER_BASE    DW    3    DUP (0)
  50. RESET_STRING    DB    24            ;EMPTY BUFFER
  51.         DB    18            ;CANCEL CONDENSED &
  52.                         ;SET 10 CPI
  53.         DB    27,45,0            ;CANCEL UNDERSCORE
  54.         DB    27,53,0            ;STOP AUTO LINEFEED
  55.         DB    27,55            ;SELECT CHAR SET 1
  56.         DB    27,61,0,0        ;CELAR DOWNLOAD BUFFER
  57.         DB    27,65,12        ;6 LINES TO INCH
  58.         DB    27,67,66        ;SET TO 66 LINES
  59.         DB    27,67,0,11        ;SET TO 11 INCHES
  60.         DB    27,70            ;CANCEL EMPHASIZED
  61.         DB    27,72            ;CANCEL DBL STRIKE NLQ
  62.         DB    27,73,0            ;STANDARD MODE
  63.         DB    27,79            ;CANCEL AUTO PERF
  64.         DB    27,82            ;CANCEL TABS
  65.         DB    27,84            ;CANCEL SUBSCRIPT &
  66.                         ;SUPERSCRIPT
  67.         DB    27,85,2            ;SET TO BIDIRECTIONAL
  68.         DB    27,87,0            ;CANCEL DOUBLE WIDE
  69.         DB    27,95,0            ;CANCEL OVERSCORE
  70.         DB    0FFH            ;END OF STRING
  71. RESIDENT    DB    'R'
  72. RETURN_ADDRESS    DB    132 DUP ('_')
  73. ROW        DB    0
  74. SAVE_CUR_COL    DB    0
  75. SAVE_CUR_END    DB    0
  76. SAVE_CUR_ROW    DB    0
  77. SAVE_CUR_START    DB    0
  78. SAVE_MODE    DB    0
  79. SAVE_MSG    DB    'SAVE'
  80. SAVE_PAGE    DB    0
  81. SAVE_SIZE    DW    0
  82. SCAN_CODE    DB    19H
  83. SCREEN_ADDRESS    DW    0B800H
  84. SCREEN_BUFFER    DW    8000 DUP (0)
  85. SOUND_STATUS    DB    'Y'
  86. TYPEWRITER_BUFF    DB    5280 DUP (' ')
  87. TYPEWRITER_MSG    DB    '  F1=PRINT  F2=CLEAR  <ESC> QUIT                    '
  88.         DB    '              LINE 00 COL 00'
  89. WINDOW_BUMP    DW    0
  90. WINDOW_COLOR    DB    0
  91. WINDOW_LINES    DW    0
  92. WINDOW_NUMBER    DW    0
  93. WINDOW_START    DW    0
  94. WINDOW_WIDTH    DW    0
  95.  
  96. WINDOW_1    DB    '╔═══IBM Proprinter Configuration Aid - Version 3.5═══╗'
  97.         DB    '║                                                    ║'
  98.         DB    '║        [1] LPT1:    [2] LPT2:    [3] LPT3:         ║'
  99.         DB    '║                                                    ║'
  100.         DB    '║ [A] Set Condensed Mode   [L] Format/Reset/Envelope ║'
  101.         DB    '║ [B] Stop Condensed Mode  [M] 1/8" Spacing          ║'
  102.         DB    '║ [C] Set 12 CPI           [N] 7/72" Spacing         ║'
  103.         DB    '║ [D] Set Emphasized Mode  [O] Set Normal Quality    ║'
  104.         DB    '║ [E] Stop Emphasized Mode [P] Set Normal Downloaded ║'
  105.         DB    '║ [F] ONE Direction Print  --------NLQ MODES-------- ║'
  106.         DB    '║ [G] TWO Direction Print  [Q] Set NLQ Normal        ║'
  107.         DB    '║ [H] Set Double Wide      [R] Set NLQ Downloaded    ║'
  108.         DB    '║ [I] Stop Double Wide     [S] Set NLQ Doublestrike  ║'
  109.         DB    '║ [J] Character Set 1      [T] Stop NLQ Doublestrike ║'
  110.         DB    '║ [K] Character Set 2      [U] Font Processing       ║'
  111.         DB    '║                [V] Typewriter Mode                 ║'
  112.         DB    '║                                                    ║'
  113.         DB    '║                    <ESC> Quit                      ║'
  114.         DB    '║                                                    ║'
  115.         DB    '╚═══════════Fred Willshaw Software (c) 1988══════════╝'
  116.  
  117. WINDOW_2    DB    '╔═════Download Font Type═════╗'
  118.         DB    '║                            ║'
  119.         DB    '║   Select Font File Type:   ║'
  120.         DB    '║                            ║'
  121.         DB    '║   1 = FONTGEN Created      ║'
  122.         DB    '║   2 = IBM Format as shown  ║'
  123.         DB    '║       in IBM Manual        ║'
  124.         DB    '║   3 = Create a Character   ║'
  125.         DB    '║                            ║'
  126.         DB    '║         <ESC> Quit         ║'
  127.         DB    '║                            ║'
  128.         DB    '╚════════════════════════════╝'
  129.  
  130. WINDOW_3    DB    '╔═════════Download Font File══════════╗'
  131.         DB    '║                                     ║'
  132.         DB    '║       Indicate File to Load:        ║'
  133.         DB    '║                                     ║'
  134.         DB    '║ Drive:                              ║'
  135.         DB    '║ Path (include intermediate slashes) ║'
  136.         DB    '║ \__________________________________ ║'
  137.         DB    '║                                     ║'
  138.         DB    '║ File Name: ____________             ║'
  139.         DB    '║                                     ║'
  140.         DB    '║              <ESC> Quit             ║'
  141.         DB    '╚═════════════════════════════════════╝'
  142.  
  143. WINDOW_4    DB    '╔════Format/Reset/Envelope═══╗'
  144.         DB    '║                            ║'
  145.         DB    '║ [A] Reset Printer          ║'
  146.         DB    '║ [B] Set Top of Form        ║'
  147.         DB    '║ [C] Form Length (Inches)   ║'
  148.         DB    '║ [D] Form Length (Lines)    ║'
  149.         DB    '║ [E] Print an Envelope      ║'
  150.         DB    '║                            ║'
  151.         DB    '║          >     <           ║'
  152.         DB    '║                            ║'
  153.         DB    '║        <ESC>  Quit         ║'
  154.         DB    '╚════════════════════════════╝'
  155.  
  156. WINDOW_5    DB    '╔════════════════════════════╗'
  157.         DB    '║ PRINTER NOT READY - Please ║'
  158.         DB    '║ correct problem and then   ║'
  159.         DB    '║ depress the <ESC> key.     ║'
  160.         DB    '╚════════════════════════════╝'
  161.  
  162. WINDOW_6    DB    '╔═══════════Return Address══════════╗'
  163.         DB    '║                                   ║'
  164.         DB    '║ _________________________________ ║'
  165.         DB    '║ _________________________________ ║'
  166.         DB    '║ _________________________________ ║'
  167.         DB    '║ _________________________________ ║'
  168.         DB    '║                                   ║'
  169. WINDOW_6A    DB    '║                        <ESC> Quit ║' 
  170.         DB    '╚═══════════════════════════════════╝'
  171.  
  172. WINDOW_6B    DB    'Return Address═'
  173. WINDOW_6C    DB    'Mailing Address'
  174. WINDOW_6D    DB    'End EACH line <ENTER>'
  175. WINDOW_6E    DB    'F1=Standard  F2=Legal'
  176.  
  177. WINDOW_7    DB    '╔══════════Create a Font══════════╗'
  178.         DB    '║ ┌───────────┐                   ║'
  179.         DB    '║ │           │ Char Code = ___   ║'
  180.         DB    '║ │           │ Attribute = _     ║'
  181.         DB    '║ │           │                   ║'
  182.         DB    '║ │           │ ',24,25,26,27,' move cursor  ║'
  183.         DB    '║ │           │ <ENTER> On/Off    ║'
  184.         DB    '║ │           │ F1 = Download     ║'
  185.         DB    '║ │           │ F2 = Save to file ║'
  186.         DB    '║ │           │ F3 = Clear        ║'
  187.         DB    '║ └───────────┘                   ║'
  188.         DB    '║            <ESC> Quit           ║'
  189.         DB    '╚═════════════════════════════════╝'
  190.  
  191. WINDOW_TABLE    DB    'A',    02,    27,15,00
  192.         DW    0991, 1151, 0000, 0000, 0000, 0000
  193.         DB    'B',    01,    18,00,00
  194.         DW    1151, 0991, 1311, 0000, 0000, 0000
  195.         DB    'C',    02,    27,58,00
  196.         DW    1311, 0000, 0000, 0000, 0000, 0000
  197.         DB    'D',    02,    27,69,00
  198.         DW    1471, 1631, 0000, 0000, 0000, 0000
  199.         DB    'E',    02,    27,70,00
  200.         DW    1631, 1471, 0000, 0000, 0000, 0000
  201.         DB    'F',    03,    27,85,01
  202.         DW    1791, 1951, 0000, 0000, 0000, 0000
  203.         DB    'G',    03,    27,85,00
  204.         DW    1951, 1791, 0000, 0000, 0000, 0000
  205.         DB    'H',    03,    27,87,01
  206.         DW    2111, 2271, 0000, 0000, 0000, 0000
  207.         DB    'I',    03,    27,87,00
  208.         DW    2271, 2111, 0000, 0000, 0000, 0000
  209.         DB    'J',    02,    27,55,00
  210.         DW    2431, 2591, 0000, 0000, 0000, 0000
  211.         DB    'K',    02,    27,54,02
  212.         DW    2591, 2431, 0000, 0000, 0000, 0000
  213.         DB    'M',    02,    27,48,00
  214.         DW    1201, 1361, 0000, 0000, 0000, 0000
  215.         DB    'N',    02,    27,49,00
  216.         DW    1361, 1201, 0000, 0000, 0000, 0000
  217.         DB    'O',    03,    27,73,00
  218.         DW    1521, 1681, 2001, 2161, 2321, 2481
  219.         DB    'P',    03,    27,73,04
  220.         DW    1681, 1521, 2001, 2161, 2321, 2481
  221.         DB    'Q',    03,    27,73,02
  222.         DW    2001, 1521, 1681, 2161, 0000, 0000
  223.         DB    'R',    03,    27,73,06
  224.         DW    2161, 1521, 1681, 2001, 0000, 0000
  225.         DB    'S',    02,    27,71,00
  226.         DW    2321, 2481, 0000, 0000, 0000, 0000
  227.         DB    'T',    02,    27,72,00
  228.         DW    2481, 2321, 0000, 0000, 0000, 0000
  229.         DB    'Z'
  230.  
  231. KBOARD_HANDLER    PROC    FAR                ;NEW INT 09H
  232.         STI
  233.         CLD
  234.         PUSH    AX
  235.         PUSH    DS
  236.         MOV    AX,40H
  237.         MOV    DS,AX
  238.         IN    AL,60H
  239.         CMP    AL,BYTE PTR CS:[SCAN_CODE]    ;RIGHT KEY ?
  240.         JNE    KBOARD_RETURN
  241.         MOV    AL,BYTE PTR DS:[17H]        ;GET KEY STATUS
  242.         AND    AL,BYTE PTR CS:[KBFLAG]        ;RIGHT SHIFTS ON ?
  243.         CMP    AL,BYTE PTR CS:[KBFLAG]
  244.         JNE    KBOARD_RETURN
  245.         IN    AL,61H                ;RESET KEYBOARD PORTS
  246.         MOV    AH,AL
  247.         OR    AL,80H
  248.         OUT    61H,AL
  249.         XCHG    AH,AL
  250.         OUT    61H,AL
  251.         CLI
  252.         MOV    AL,20H                ;SIGNAL EOI
  253.         OUT    20H,AL
  254.         POP    DS
  255.         POP    AX
  256.         JMP    KBOARD_MATCH
  257.  
  258. KBOARD_RETURN:    POP    DS                ;JUMP TO OLD INTERRUPT
  259.         POP    AX
  260.         JMP    DWORD PTR CS:[KBOARD_VECTOR]
  261.  
  262. KBOARD_MATCH:    STI                    ;LET INTERRUPTS BEGIN
  263.         PUSH    AX
  264.         PUSH    BX
  265.         PUSH    CX
  266.         PUSH    DX
  267.         PUSH    DI
  268.         PUSH    SI
  269.         PUSH    DS
  270.         PUSH    ES
  271.  
  272.         MOV    AX,CS
  273.         MOV    ES,AX
  274.  
  275.         MOV    AX,40H                ;GET LPT1-3 ADDRESSES
  276.         MOV    DS,AX
  277.         LEA    DI,PRINTER_BASE
  278.         MOV    SI,8
  279.         MOV    CX,3
  280.         REP    MOVSW
  281.  
  282.         MOV    AX,CS
  283.         MOV    DS,AX
  284.  
  285.         MOV    AX,PRINTER_BASE            ;DEFAULT TO LPT1:
  286.         MOV    ACTIVE_PRINTER,AX
  287.  
  288.         MOV    AH,0FH                ;GET VIDEO MODE
  289.         INT    10H
  290.         MOV    SAVE_PAGE,BH
  291.         MOV    SAVE_MODE,AL
  292.  
  293.         MOV    AH,3                ;GET CURSOR LOCATION
  294.         MOV    BH,SAVE_PAGE
  295.         INT    10H
  296.         MOV    SAVE_CUR_ROW,DH
  297.         MOV    SAVE_CUR_COL,DL
  298.  
  299.         CMP    SAVE_MODE,7
  300.         JNE    CURSOR_OKAY
  301.         CMP    CX,0607H            ;VALID CURSOR MODE
  302.         JNE    CURSOR_OKAY            ;FOR MONOCHROME ?
  303.         MOV    CX,0B0CH
  304.  
  305. CURSOR_OKAY:    MOV    SAVE_CUR_START,CH
  306.         MOV    SAVE_CUR_END,CL
  307.  
  308.         MOV    AL,SAVE_MODE
  309.         CMP    AL,7
  310.         JE    MONO_VIDEO
  311.         CMP    AH,40                ;40 COLUMN SCREEN
  312.         JNE    COLOR_SCREEN
  313.         CALL    BEEP
  314.         JMP    KBOARD_FINISH
  315.  
  316. COLOR_SCREEN:    MOV    MONO,'N'            ;SET AS C/G ADAPTER
  317.         CMP    SAVE_MODE,8            ;SEE IF PCJR OR
  318.                             ;EGA ADAPTER
  319.         JL    CS_005                ;IF IT IS NO V_TRACE
  320.         MOV    MONO,'Y'            ;WAITING
  321. CS_005:        MOV    SCREEN_ADDRESS,0B800H
  322.         CMP    COLOR_REQUEST,'M'
  323.         JE    CS_010
  324.         MOV    COLOR_1,1FH
  325. CS_010:        MOV    COLOR_2,9FH
  326.         MOV    SAVE_SIZE,25
  327.         CMP    SAVE_MODE,4
  328.         JB    SCREEN_SET
  329.         MOV    SAVE_SIZE,100
  330.         JMP    SCREEN_SET
  331.  
  332. MONO_VIDEO:    MOV    MONO,'Y'            ;SET AS MONOCHROME
  333.         MOV    SCREEN_ADDRESS,0B000H
  334.         MOV    COLOR_1,07H
  335.         MOV    COLOR_2,0F0H
  336.         MOV    SAVE_SIZE,25
  337.  
  338. SCREEN_SET:    MOV    CX,SAVE_SIZE
  339.         MOV    AX,SCREEN_ADDRESS
  340.         MOV    DS,AX
  341.         MOV    SI,0
  342.         LEA    DI,SCREEN_BUFFER
  343.  
  344. SAVE_WINDOW:    PUSH    CX                ;STORE CURRENT SCREEN
  345.         MOV    CX,80
  346.         CALL    V_TRACE
  347.         REP    MOVSW
  348.         POP    CX
  349.         LOOP    SAVE_WINDOW
  350.  
  351.         MOV    AX,CS
  352.         MOV    DS,AX
  353.         CMP    SAVE_MODE,7            ;MUST SCREEN BE RESET
  354.         JE    SCREEN_OKAY_1
  355.         CMP    SAVE_MODE,4
  356.         JB    SCREEN_OKAY_1
  357.         MOV    AH,0                ;GRAPHICS SCREEN
  358.         MOV    AL,3                       ;MUST RESET
  359.         INT    10H
  360.  
  361. SCREEN_OKAY_1:    MOV    AX,SCREEN_ADDRESS
  362.         MOV    ES,AX
  363.         MOV    AX,CS
  364.         MOV    DS,AX
  365.         MOV    AH,2                ;MOVE CURSOR TO 0,0
  366.         MOV    DH,0
  367.         MOV    DL,0
  368.         MOV    BH,SAVE_PAGE
  369.         INT    10H
  370.         CALL    DISPLAY_WIN_1
  371.  
  372. GET_REQUEST:    MOV    AH,00H                       ;MAIN PROGRAM LOOP
  373.         INT    16H
  374.         CMP    AH,01H                ;ESCAPE
  375.         JNE    NOT_ESCAPE
  376.         JMP    LEAVE_PROGRAM
  377.  
  378. NOT_ESCAPE:    CMP    AL,'1'                ;PRINTER CHANGE ?
  379.         JB    START_CHECK
  380.         CMP    AL,'3'
  381.         JA    START_CHECK
  382.         CALL    CHANGE_PRINTER
  383.         JMP    GET_REQUEST
  384.  
  385. START_CHECK:    LEA    SI,WINDOW_TABLE            ;CHECK VALID LETTER
  386.         CMP    AL,'a'
  387.         JB    CHECK_FONT
  388.         CMP    AL,'z'
  389.         JA    BAD_REQUEST
  390.         SUB    AL,' '
  391.  
  392. CHECK_FONT:    CMP    AL,'U'                ;FONT DOWNLOAD REQUEST
  393.         JNE    CHECK_FORMAT
  394.         JMP    FONT_REQUEST
  395.  
  396. CHECK_FORMAT:    CMP    AL,'L'                ;PAGE FORMAT/RESET
  397.         JNE    CHECK_TWRITER
  398.         CALL    PAGE_FORMAT
  399.         JMP    GET_REQUEST
  400.  
  401. CHECK_TWRITER:    CMP    AL,'V'                ;TYPEWRITER MODE
  402.         JNE    CHECK_LETTER
  403.         CALL    TYPEWRITER
  404.         JMP    GET_REQUEST
  405.  
  406. CHECK_LETTER:    CMP    AL,'A'                       ;VALID TABLE LETTER ?
  407.         JB    BAD_REQUEST
  408.         CMP    AL,'T'
  409.         JA    BAD_REQUEST
  410.  
  411. CHECK_TABLE:    MOV    DL,DS:[SI]            ;MATCH TABLE
  412.         CMP    DL,'Z'
  413.         JNE    NOT_TABLE_END
  414.  
  415. BAD_REQUEST:    CALL    BEEP                ;LETTER NOT FOUND
  416.         JMP    GET_REQUEST
  417.  
  418. NOT_TABLE_END:    CMP    AL,DL                ;IS IT A MATCH ?
  419.         JNE    TABLE_NO_MATCH
  420.         MOV    CH,0                ;YES - SEND STRING
  421.         MOV    CL,BYTE PTR DS:[SI+1]
  422.         ADD    SI,2
  423.         CALL    SEND_PRINTER
  424.         JMP    GET_REQUEST    
  425.  
  426. TABLE_NO_MATCH:    ADD    SI,17                ;NO - LOOK SOMEMORE
  427.         JMP    CHECK_TABLE
  428.  
  429. LEAVE_PROGRAM:    MOV    AX,CS                ;ALL DONE - RESET
  430.         MOV    DS,AX                ;PATH AND CURSOR
  431.         CMP    SAVE_MODE,7
  432.         JE    SCREEN_OKAY_2
  433.         CMP    SAVE_MODE,4
  434.         JB    SCREEN_OKAY_2
  435.  
  436.         MOV    AH,0
  437.         MOV    AL,SAVE_MODE
  438.         INT    10H
  439.  
  440. SCREEN_OKAY_2:    MOV    AH,5                ;RESTORE PAGE #
  441.         MOV    AL,SAVE_PAGE
  442.         INT    10H
  443.  
  444.         MOV    AH,2                ;RESTORE CURSOR
  445.         MOV    DH,SAVE_CUR_ROW
  446.         MOV    DL,SAVE_CUR_COL
  447.         MOV    BH,SAVE_PAGE
  448.         INT    10H
  449.  
  450.         MOV    AH,1                ;RESTORE CURSOR PARM
  451.         MOV    CH,SAVE_CUR_START
  452.         MOV    CL,SAVE_CUR_END
  453.         INT    10H
  454.  
  455.         MOV    AX,SCREEN_ADDRESS
  456.         MOV    ES,AX
  457.         LEA    SI,SCREEN_BUFFER
  458.         MOV    DI,0
  459.         MOV    CX,SAVE_SIZE
  460.  
  461. SCREEN_RESTORE:    PUSH    CX                       ;RELOAD OLD SCREEN
  462.         MOV    CX,80
  463.         CALL    V_TRACE
  464.         REP    MOVSW
  465.         POP    CX
  466.         LOOP    SCREEN_RESTORE
  467.  
  468. KBOARD_FINISH:    POP    ES
  469.         POP    DS
  470.         POP    SI
  471.         POP    DI
  472.         POP    DX
  473.         POP    CX
  474.         POP    BX
  475.         POP    AX
  476.  
  477.         CMP    BYTE PTR CS:[RESIDENT],'R'
  478.         JE    DO_IRET
  479.         RET                    ;BACK TO DOS
  480.  
  481. DO_IRET:    IRET                    ;BACK TO CALLER
  482.  
  483. KBOARD_HANDLER    ENDP
  484.  
  485. BACKSPACE    PROC    NEAR
  486.         DEC    DI                ;MOVE BACK 1 POS
  487.         DEC    DI
  488.         MOV    AL,'_'
  489.         MOV    ES:[DI],AL            ;BLANK IT
  490.         MOV    AH,CUR_COLOR_1
  491.         MOV    ES:[DI+3],AH            ;REMOVE FLASH
  492.         MOV    AH,CUR_COLOR_2
  493.         MOV    ES:[DI+1],AH            ;SET FLASH
  494.         DEC    CX                ;CHANGE CHAR COUNT
  495.         DEC    SI
  496.         MOV    AL,' '
  497.         MOV    DS:[SI],AL            ;BLANK MEMORY NAME
  498.         RET
  499. BACKSPACE    ENDP
  500.  
  501. BEEP        PROC    NEAR
  502.         CMP    SOUND_STATUS,'N'
  503.         JE    BP_020
  504.         PUSH    AX
  505.         PUSH    CX
  506.         PUSH    DX
  507.         MOV    DX,300
  508.         IN    AL,61H
  509.         AND    AL,0FEH
  510. BP_005:        OR    AL,2
  511.         OUT    61H,AL
  512.         MOV    CX,233
  513. BP_010:        LOOP    BP_010
  514.         AND    AL,0FDH
  515.         OUT    61H,AL
  516.         MOV    CX,233
  517. BP_015:        LOOP    BP_015
  518.         DEC    DX
  519.         JNZ    BP_005
  520.         POP    DX
  521.         POP    CX
  522.         POP    AX
  523. BP_020:        RET
  524. BEEP        ENDP
  525.  
  526. CURSOR_ON    PROC    NEAR
  527.         CMP    COLUMN,11
  528.         JL    CO_005
  529.         MOV    COLUMN,0
  530.         INC    ROW
  531. CO_005:        CMP    ROW,8
  532.         JL    CO_010
  533.         MOV    ROW,0
  534. CO_010:        CMP    COLUMN,-1
  535.         JG    CO_015
  536.         DEC    ROW
  537.         MOV    COLUMN,10
  538. CO_015:        CMP    ROW,-1
  539.         JG    CO_020
  540.         MOV    ROW,7
  541. CO_020:        MOV    AH,2
  542.         MOV    DH,ROW
  543.         ADD    DH,7
  544.         MOV    DL,COLUMN
  545.         ADD    DL,27
  546.         MOV    BH,0
  547.         INT    10H
  548.         RET
  549. CURSOR_ON    ENDP
  550.  
  551. CHANGE_PRINTER    PROC    NEAR
  552.         SUB    AL,'1'
  553.         PUSH    AX
  554.         PUSH    AX
  555.         MOV    AH,0
  556.         MOV    DX,AX
  557. CP_005:        MOV    AH,02H
  558.         INT    17H
  559.         TEST    AH,00101001B            ;PRINTER AVAILABLE ?
  560.         JZ    CP_010                ;YES
  561.         CALL    BEEP                ;NO
  562.         MOV    WINDOW_BUMP,100
  563.         MOV    AL,COLOR_8
  564.         MOV    WINDOW_COLOR,AL
  565.         MOV    WINDOW_LINES,5
  566.         MOV    AX,OFFSET WINDOW_5        ;PRINTER NOT READY
  567.         MOV    WINDOW_NUMBER,AX
  568.         MOV    WINDOW_START,1332
  569.         MOV    WINDOW_WIDTH,30
  570.         CALL    DISPLAY_WINDOW
  571.         MOV    AH,0
  572.         INT    16H
  573.         PUSH    AX
  574.         CALL    DISPLAY_WIN_1
  575.         POP    AX
  576.         CMP    AH,01H
  577.         JNE    CP_005
  578.         POP    AX
  579.         POP    AX
  580.         RET
  581.  
  582. CP_010:        POP    AX
  583.         MOV    AH,0                ;GET PRINTER ADDRESS
  584.         MOV    DL,2
  585.         MUL    DL
  586.         MOV    BX,OFFSET PRINTER_BASE
  587.         ADD    BX,AX
  588.         MOV    AX,[BX]
  589.         MOV    ACTIVE_PRINTER,AX
  590.         MOV    AH,COLOR_1
  591.         CALL    V_TRACE
  592.         MOV    BYTE PTR ES:[685],AH
  593.         MOV    BYTE PTR ES:[711],AH
  594.         MOV    BYTE PTR ES:[737],AH
  595.         POP    AX
  596.         MOV    DI,685
  597.         CMP    AL,1
  598.         JB    CP_015
  599.         MOV    DI,711
  600.         CMP    AL,2
  601.         JB    CP_015
  602.         MOV    DI,737
  603. CP_015:        MOV    AL,COLOR_2
  604.         CALL    V_TRACE
  605.         MOV    BYTE PTR ES:[DI],AL
  606.         RET
  607. CHANGE_PRINTER    ENDP
  608.  
  609. DISPLAY_WINDOW    PROC    NEAR
  610.         MOV    AX,SCREEN_ADDRESS
  611.         MOV    ES,AX
  612.         MOV    BX,WINDOW_NUMBER
  613.         MOV    DI,WINDOW_START
  614.         MOV    AH,WINDOW_COLOR
  615.         MOV    CX,WINDOW_LINES
  616. DW_005:        PUSH    CX
  617.         MOV    CX,WINDOW_WIDTH
  618.         CALL    V_TRACE
  619. DW_010:        MOV    AL,DS:[BX]
  620.         MOV    ES:[DI],AL
  621.         INC    BX
  622.         INC    DI
  623.         MOV    ES:[DI],AH
  624.         INC    DI
  625.         LOOP    DW_010
  626.         POP    CX
  627.         ADD    DI,WINDOW_BUMP
  628.         LOOP    DW_005
  629.         RET
  630. DISPLAY_WINDOW    ENDP
  631.  
  632. DISPLAY_WIN_1    PROC    NEAR
  633.         MOV    WINDOW_BUMP,52            ;SHOW PRIMARY MENU
  634.         MOV    AL,COLOR_1
  635.         MOV    WINDOW_COLOR,AL
  636.         MOV    WINDOW_LINES,20
  637.         MOV    AX,OFFSET WINDOW_1
  638.         MOV    WINDOW_NUMBER,AX
  639.         MOV    WINDOW_START,344
  640.         MOV    WINDOW_WIDTH,54
  641.         CALL    DISPLAY_WINDOW
  642.         RET
  643. DISPLAY_WIN_1    ENDP
  644.  
  645. ENVELOPE    PROC    NEAR
  646.         PUSH    ES
  647.         PUSH    DS
  648.         PUSH    SI
  649.         PUSH    DI
  650.         MOV    AX,CS
  651.         MOV    DS,AX
  652.         MOV    AX,SCREEN_ADDRESS
  653.         MOV    ES,AX
  654. EN_005:        MOV    AH,0
  655.         INT    16H
  656.         CMP    AL,0                ;INVALID CHARACTER
  657.         JE    EN_015
  658.         CMP    AL,27                ;ESCAPE
  659.         JNE    EN_010
  660.         POP    DI
  661.         POP    SI
  662.         JMP    EN_035
  663. EN_010:        CMP    AL,08H                ;BACKSPACE
  664.         JNE    EN_020
  665.         CMP    CX,0                ;ALREADY AT POS 1
  666.         JE    EN_015
  667.         CALL    BACKSPACE
  668.         JMP    EN_005
  669. EN_015:        CALL    BEEP
  670.         JMP    EN_005
  671. EN_020:        CMP    AL,0DH                ;ENTER
  672.         JNE    EN_025
  673.         MOV    AL,CUR_COLOR_1
  674.         CALL    V_TRACE
  675.         MOV    BYTE PTR ES:[DI+1],AL
  676.         POP    DI
  677.         POP    SI
  678.         MOV    AH,0
  679.         CMP    LINE,4
  680.         JE    EN_035
  681.         ADD    DI,160
  682.         ADD    SI,33
  683.         MOV    AL,CUR_COLOR_2
  684.         CALL    V_TRACE
  685.         MOV    BYTE PTR ES:[DI+1],AL
  686.         PUSH    SI
  687.         PUSH    DI
  688.         MOV    CX,0
  689.         INC    LINE
  690.         JMP    EN_005
  691. EN_025:        CMP    CX,33
  692.         JB    EN_030
  693.         JMP    EN_015
  694. EN_030:        CALL    V_TRACE
  695.         MOV    BYTE PTR ES:[DI],AL        ;SAVE/DISPLAY CHAR
  696.         MOV    BYTE PTR DS:[SI],AL
  697.         MOV    AL,CUR_COLOR_1
  698.         MOV    BYTE PTR ES:[DI+1],AL
  699.         ADD    DI,2
  700.         MOV    AL,CUR_COLOR_2
  701.         MOV    BYTE PTR ES:[DI+1],AL
  702.         INC    SI
  703.         INC    CX
  704.         JMP    EN_005        
  705. EN_035:        POP    DS
  706.         POP    ES
  707.         RET
  708. ENVELOPE    ENDP
  709.  
  710. FONT_REQUEST    PROC    NEAR
  711.         MOV    AX,CS
  712.         MOV    DS,AX
  713.         MOV    ES,AX
  714.         LEA    DI,ASCIIZ            ;BLANK SEARCH HANDLE
  715.         MOV    AL,00H
  716.         MOV    CX,128
  717.         REP    STOSB
  718.  
  719.         MOV    WINDOW_BUMP,100
  720.         MOV    AL,COLOR_3
  721.         MOV    WINDOW_COLOR,AL
  722.         MOV    WINDOW_LINES,12
  723.         LEA    SI,WINDOW_2
  724.         MOV    WINDOW_NUMBER,SI
  725.         MOV    WINDOW_START,516
  726.         MOV    WINDOW_WIDTH,30
  727.         CALL    DISPLAY_WINDOW
  728.  
  729. FR_005:        MOV    AX,CS
  730.         MOV    DS,AX
  731.         MOV    AH,0
  732.         INT    16H
  733.         CMP    AH,01H                       ;ESCAPE
  734.         JNE    FR_010
  735.         JMP    FR_070
  736.  
  737. FR_010:        CMP    AL,'1'                ;FONTGEN CREATED
  738.         JE    FR_020
  739.         CMP    AL,'2'                ;IBM STANDARD
  740.         JE    FR_020
  741.         CMP    AL,'3'                ;CREATE A CHARACTER
  742.         JNE    FR_015
  743.         JMP    FR_075
  744. FR_015:        CALL    BEEP                ;ERROR
  745.         JMP    FR_005
  746.  
  747. FR_020:        MOV    FONT_TYPE,AL
  748.         PUSH    ES
  749.         MOV    AX,CS
  750.         MOV    ES,AX
  751.         LEA    SI,LOAD_MSG+2
  752.         LEA    DI,WINDOW_3+103
  753.         MOV    CX,4
  754.         REP    MOVSB
  755.         POP    ES
  756.         CALL    GET_DSN
  757.         CMP    AH,0
  758.         JE    FR_025
  759.         JMP    FR_070
  760.  
  761. FR_025:        MOV    AX,CS
  762.         MOV    DS,AX
  763.         MOV    ES,AX
  764.  
  765.         MOV    AH,3DH                ;OPEN FONT FILE
  766.         MOV    AL,00H
  767.         LEA    DX,ASCIIZ
  768.         CLC
  769.         INT    21H
  770.         JNC    FR_030
  771.         JMP    FR_065
  772. FR_030:        MOV    HANDLE,AX            ;SAVE HANDLE
  773.  
  774. FR_035:        MOV    AX,SCREEN_ADDRESS
  775.         MOV    ES,AX
  776.         LEA    SI,LOAD_MSG            ;SHOW LOADING
  777.         MOV    DI,2478
  778.         MOV    CX,10
  779.         MOV    AH,COLOR_2
  780.         CALL    V_TRACE
  781. FR_040:        MOV    AL,DS:[SI]
  782.         MOV    ES:[DI],AL
  783.         MOV    ES:[DI+1],AH
  784.         INC    SI
  785.         INC    DI
  786.         INC    DI
  787.         LOOP    FR_040
  788.  
  789.         MOV    AX,CS
  790.         MOV    ES,AX
  791.         CMP    FONT_TYPE,'2'            ;IS IT IBM FORMAT ?
  792.         JE    FR_050
  793.         LEA    SI,FONTGEN_PREFIX        ;SEND PREFIX
  794.         MOV    CX,6
  795. FR_045:        MOV    AL,DS:[SI]
  796.         CALL    PRINTER_PORT
  797.         INC    SI
  798.         LOOP    FR_045
  799. FR_050:        MOV    FONT_CTR,11            ;COUNTER FOR FONTGEN
  800. FR_055:        CMP    FONT_TYPE,'2'            ;IBM FORMAT ?
  801.         JE    FR_060
  802.         INC    FONT_CTR
  803.         CMP    FONT_CTR,12
  804.         JB    FR_060
  805.         MOV    AL,0
  806.         CALL    PRINTER_PORT
  807.         MOV    FONT_CTR,0
  808.  
  809. FR_060:        MOV    CX,1                ;READ FONT FILE
  810.         MOV    BX,HANDLE
  811.         LEA    DX,BUFFER
  812.         MOV    AH,3FH
  813.         INT    21H
  814.         CMP    AX,0
  815.         JE    FR_070
  816.         MOV    SI,DX
  817.         MOV    AL,BYTE PTR DS:[SI]
  818.         CALL    PRINTER_PORT
  819.                JMP    FR_055    
  820.  
  821. FR_065:        CALL    BEEP
  822.         JMP    FONT_REQUEST
  823.  
  824. FR_070:        MOV    AH,3EH                ;CLOSE FONT FILE
  825.         INT    21H
  826.  
  827.         MOV    AX,CS
  828.         MOV    DS,AX
  829.         CALL    DISPLAY_WIN_1
  830.  
  831.         JMP    GET_REQUEST
  832.  
  833. FR_075:        MOV    WINDOW_BUMP,90
  834.         MOV    AL,COLOR_6
  835.         MOV    WINDOW_COLOR,AL
  836.         MOV    WINDOW_LINES,13
  837.         LEA    SI,WINDOW_7
  838.         MOV    WINDOW_NUMBER,SI
  839.         MOV    WINDOW_START,848
  840.         MOV    WINDOW_WIDTH,35
  841.         CALL    DISPLAY_WINDOW
  842.  
  843.         LEA    SI,FONT_CHARACTER
  844.         MOV    DI,1174
  845.         MOV    CX,11
  846. FR_080:        PUSH    CX
  847.         PUSH    DI
  848.         MOV    BL,10000000B
  849.         MOV    CX,8
  850.         CALL    V_TRACE
  851. FR_085:        MOV    AL,BYTE PTR DS:[SI]
  852.         AND    AL,BL
  853.         CMP    AL,BL
  854.         JNE    FR_090
  855.         MOV    AL,9
  856.         MOV    BYTE PTR ES:[DI],AL
  857. FR_090:        SHR    BL,1
  858.         ADD    DI,160
  859.         LOOP    FR_085
  860.         POP    DI
  861.         POP    CX
  862.         ADD    DI,2
  863.         INC    SI
  864.         LOOP    FR_080
  865.  
  866. FR_095:        MOV    AL,'_'
  867.         MOV    AH,COLOR_7
  868.         CALL    V_TRACE
  869.         MOV    BYTE PTR ES:[1224],AL
  870.         MOV    BYTE PTR ES:[1226],AL
  871.         MOV    BYTE PTR ES:[1228],AL
  872.         MOV    BYTE PTR ES:[1225],AH
  873.         MOV    DI,1224
  874.         MOV    SI,OFFSET FORMS_BUFFER
  875.         MOV    CX,0
  876. FR_100:        MOV    AH,0
  877.         INT    16H
  878.         CMP    AL,08H
  879.         JNE    FR_105
  880.         CMP    CX,0
  881.         JE    FR_120
  882.         MOV    AL,COLOR_6
  883.         MOV    CUR_COLOR_1,AL
  884.         MOV    AL,COLOR_7
  885.         MOV    CUR_COLOR_2,AL
  886.         CALL    BACKSPACE
  887.         JMP    FR_100
  888. FR_105:        CMP    AH,01H
  889.         JNE    FR_110
  890.         JMP    FR_235
  891. FR_110:        CMP    AL,0DH
  892.         JNE    FR_115
  893.         JMP    FR_135
  894. FR_115:        CMP    AL,'0'
  895.         JB    FR_120
  896.         CMP    AL,'9'
  897.         JA    FR_120
  898.         JMP    FR_130
  899. FR_120:        CMP    AH,3DH
  900.         JNE    FR_125
  901.         JMP    FR_280
  902. FR_125:        CALL    BEEP
  903.         JMP    FR_100
  904. FR_130:        MOV    AH,COLOR_6
  905.         CALL    V_TRACE
  906.         MOV    BYTE PTR ES:[DI],AL
  907.         MOV    BYTE PTR DS:[SI],AL
  908.         MOV    BYTE PTR ES:[DI+1],AH
  909.         ADD    DI,2
  910.         INC    SI
  911.         INC    CX
  912.         CMP    CX,3
  913.         JE    FR_135
  914.         JMP    FR_100
  915. FR_135:        MOV    AX,0
  916.         MOV    SI,OFFSET FORMS_BUFFER
  917.         CMP    CX,3
  918.         JB    FR_140
  919.         MOV    DL,100
  920.         MOV    AL,CS:[SI]
  921.         SUB    AL,'0'
  922.         MUL    DL
  923.         INC    SI
  924. FR_140:        PUSH    AX
  925.         CMP    CX,2
  926.         JB    FR_145
  927.         MOV    DL,10
  928.         MOV    AL,CS:[SI]
  929.         SUB    AL,'0'
  930.         MUL    DL
  931.         XCHG    AX,BX
  932.         POP    AX
  933.         ADD    AX,BX
  934.         PUSH    AX
  935.         INC    SI
  936. FR_145:        POP    AX
  937.         MOV    BH,0
  938.         MOV    BL,CS:[SI]
  939.         SUB    BL,'0'
  940.         ADD    AX,BX
  941.         CMP    AX,127
  942.         JB    FR_150
  943.         CALL    BEEP
  944.         JMP    FR_095
  945. FR_150:        CMP    AX,32
  946.         JA    FR_155
  947.         CALL    BEEP
  948.         JMP    FR_095
  949. FR_155:        LEA    SI,FONTREG_PREFIX+5
  950.         MOV    BYTE PTR DS:[SI],AL
  951.         MOV    AH,COLOR_7
  952.         CALL    V_TRACE
  953.         MOV    BYTE PTR ES:[1385],AH
  954.         MOV    AH,0
  955.         INT    16H
  956.         CMP    AL,'0'
  957.         JE    FR_165
  958.         CMP    AL,'1'
  959.         JE    FR_165
  960.         CMP    AH,01H
  961.         JNE    FR_160
  962.         JMP    FR_235
  963. FR_160:        CALL    BEEP
  964.         JMP    FR_155
  965. FR_165:        MOV    AH,COLOR_6
  966.         CALL    V_TRACE
  967.         MOV    BYTE PTR ES:[1384],AL
  968.         MOV    BYTE PTR ES:[1385],AH
  969.         SUB    AL,'0'
  970.         CMP    AL,0
  971.         JE    FR_167
  972.         MOV    AL,128
  973. FR_167:        LEA    SI,FONTREG_PREFIX+6
  974.         MOV    BYTE PTR DS:[SI],AL
  975.  
  976.         MOV    COLUMN,0
  977.         MOV    ROW,0
  978.         CALL    CURSOR_ON
  979.  
  980. FR_170:        MOV    AH,0
  981.         INT    16H
  982.         CMP    AH,01H                       ;ESCAPE
  983.         JNE    FR_175
  984.         JMP    FR_230
  985. FR_175:        CMP    AH,4DH                ;RIGHT ARROW
  986.         JE    FR_195
  987.         CMP    AH,4BH                ;LEFT ARROW
  988.         JE    FR_200
  989.         CMP    AH,48H                ;UP ARROW
  990.         JE    FR_205
  991.         CMP    AH,50H                ;DOWN ARROW
  992.         JE    FR_210
  993.         CMP    AL,0DH                ;ENTER
  994.         JE    FR_215
  995.         CMP    AH,3CH                ;SAVE
  996.         JNE    FR_180
  997.         JMP    FR_240
  998. FR_180:        CMP    AH,3BH                ;DOWNLOAD
  999.         JNE    FR_185
  1000.         JMP    FR_265
  1001. FR_185:        CMP    AH,3DH                ;CLEAR
  1002.         JNE    FR_190
  1003.         JMP    FR_280
  1004. FR_190:        CALL    BEEP
  1005.         JMP    FR_170
  1006.  
  1007. FR_195:        INC    COLUMN
  1008.         CALL    CURSOR_ON
  1009.         JMP    FR_170
  1010.  
  1011. FR_200:        DEC    COLUMN
  1012.         CALL    CURSOR_ON
  1013.         JMP    FR_170
  1014.  
  1015. FR_205:        DEC    ROW
  1016.         CALL    CURSOR_ON
  1017.         JMP    FR_170
  1018.  
  1019. FR_210:        INC    ROW
  1020.         CALL    CURSOR_ON
  1021.         JMP    FR_170
  1022.  
  1023. FR_215:        MOV    AH,0
  1024.         MOV    AL,COLUMN
  1025.         SHL    AL,1
  1026.         MOV    DI,1174
  1027.         ADD    DI,AX
  1028.         MOV    AL,ROW
  1029.         MOV    DL,160
  1030.         MUL    DL
  1031.         ADD    DI,AX
  1032.         CMP    BYTE PTR ES:[DI],9        ;OFF
  1033.         JE    FR_220
  1034.         MOV    AL,9
  1035.         CALL    V_TRACE
  1036.         MOV    BYTE PTR ES:[DI],AL
  1037.         JMP    FR_225
  1038. FR_220:        MOV    AL,32                ;ON
  1039.         CALL    V_TRACE
  1040.         MOV    BYTE PTR ES:[DI],AL
  1041. FR_225:        INC    COLUMN
  1042.         CALL    CURSOR_ON
  1043.         JMP    FR_170
  1044.  
  1045. FR_230:        CALL    SAVE_FONT
  1046.         
  1047. FR_235:        MOV    AH,2
  1048.         MOV    DH,0
  1049.         MOV    DL,0
  1050.         MOV    BH,0
  1051.         INT    10H
  1052.         CALL    DISPLAY_WIN_1
  1053.         JMP    GET_REQUEST
  1054.  
  1055. FR_240:        CALL    SAVE_FONT
  1056.         MOV    AH,2
  1057.         MOV    DH,0
  1058.         MOV    DL,0
  1059.         MOV    BH,0
  1060.         INT    10H
  1061.         PUSH    ES
  1062.         MOV    AX,CS
  1063.         MOV    ES,AX
  1064.         LEA    SI,SAVE_MSG
  1065.         LEA    DI,WINDOW_3+103
  1066.         MOV    CX,4
  1067.         REP    MOVSB
  1068.         LEA    DI,ASCIIZ
  1069.         MOV    AL,00H
  1070.         MOV    CX,128
  1071.         REP    STOSB
  1072.         POP    ES
  1073.         CALL    GET_DSN
  1074.         CMP    AH,0
  1075.         JE    FR_245
  1076.         JMP    FR_075
  1077. FR_245:        MOV    AX,CS
  1078.         MOV    DS,AX
  1079.         MOV    ES,AX
  1080.         MOV    AH,3DH                ;OPEN FONT FILE
  1081.         MOV    AL,01H
  1082.         LEA    DX,ASCIIZ
  1083.         CLC
  1084.         INT    21H
  1085.         JC    FR_250                ;NOT FOUND
  1086.         JMP    FR_255
  1087. FR_250:        MOV    AH,3CH                ;CREATE NEW FILE
  1088.         MOV    CX,0
  1089.         LEA    DX,ASCIIZ        
  1090.         CLC
  1091.         INT    21H
  1092.         JNC    FR_255
  1093.         JMP    FR_260
  1094. FR_255:        MOV    HANDLE,AX
  1095.         MOV    BX,AX
  1096.         MOV    AH,42H                       ;SET TO EOF
  1097.         MOV    CX,0
  1098.         MOV    DX,0
  1099.         MOV    AL,2
  1100.         INT    21H
  1101.         MOV    BX,HANDLE
  1102.         MOV    AH,40H                ;WRITE IT
  1103.         MOV    CX,19
  1104.         LEA    DX,FONTREG_PREFIX
  1105.         INT    21H
  1106.         MOV    AH,3EH                ;CLOSE
  1107.         MOV    BX,HANDLE
  1108.         INT    21H
  1109.         JMP    FR_075
  1110. FR_260:        CALL    BEEP                ;ERROR
  1111.         JMP    FR_075
  1112.  
  1113. FR_265:        CALL    SAVE_FONT
  1114.         MOV    AH,2
  1115.         MOV    DH,0
  1116.         MOV    DL,0
  1117.         MOV    BH,0
  1118.         INT    10H
  1119.         LEA    SI,FONTREG_PREFIX
  1120.         MOV    CX,8
  1121. FR_270:        MOV    AL,DS:[SI]
  1122.         CALL    PRINTER_PORT
  1123.         INC    SI
  1124.         LOOP    FR_270
  1125.         LEA    SI,FONT_CHARACTER
  1126.         MOV    CX,11
  1127. FR_275:        MOV    AL,DS:[SI]
  1128.         CALL    PRINTER_PORT
  1129.         INC    SI
  1130.         LOOP    FR_275
  1131.         JMP    FR_075
  1132.         
  1133. FR_280:        LEA    BX,FONT_CHARACTER        ;CLEAR PIN MAP
  1134.         MOV    AL,00H
  1135.         MOV    CX,11
  1136. FR_285:        MOV    DS:[BX],AL
  1137.         INC    BX
  1138.         LOOP    FR_285
  1139.         JMP    FR_075
  1140. FONT_REQUEST    ENDP
  1141.  
  1142. GET_DSN        PROC    NEAR
  1143.         MOV    WINDOW_BUMP,82
  1144.         MOV    AL,COLOR_4
  1145.         MOV    WINDOW_COLOR,AL
  1146.         MOV    WINDOW_LINES,12
  1147.         LEA    SI,WINDOW_3
  1148.         MOV    WINDOW_NUMBER,SI
  1149.         MOV    WINDOW_START,848
  1150.         MOV    WINDOW_WIDTH,39
  1151.         CALL    DISPLAY_WINDOW
  1152.  
  1153. GD_005:        MOV    AH,0                ;GET DRIVE
  1154.         INT    16H
  1155.         CMP    AH,01H                       ;ESCAPE
  1156.         JNE    GD_010
  1157.         RET
  1158. GD_010:        CMP    AL,'a'
  1159.         JB    GD_015
  1160.         CMP    AL,'z'
  1161.         JA    GD_015
  1162.         SUB    AL,' '
  1163. GD_015:        CMP    AL,'A'
  1164.         JB    GD_020
  1165.         CMP    AL,'Z'
  1166.         JA    GD_020
  1167.         LEA    SI,ASCIIZ
  1168.         MOV    BYTE PTR DS:[SI],AL
  1169.         MOV    BYTE PTR ES:[1506],AL
  1170.         MOV    AH,COLOR_4
  1171.         MOV    BYTE PTR ES:[1507],AH
  1172.         JMP    GD_025
  1173. GD_020:        CALL    BEEP
  1174.         JMP    GD_005
  1175.  
  1176. GD_025:        MOV    AL,':'
  1177.         MOV    BYTE PTR DS:[SI+1],AL
  1178.         MOV    AL,'\'
  1179.         MOV    BYTE PTR DS:[SI+2],AL
  1180.         ADD    SI,3
  1181.         MOV    AH,COLOR_5            ;GET NEW PATH
  1182.         MOV    BYTE PTR ES:[1815],AH
  1183.         MOV    DI,1814
  1184.         MOV    CX,0
  1185. GD_030:        MOV    AH,0
  1186.         INT    16H
  1187.         CMP    AH,01H                ;ESCAPE
  1188.         JNE    GD_035
  1189.         RET
  1190. GD_035:        CMP    AL,08H                ;BACKSPACE
  1191.         JNE    GD_045
  1192.         CMP    CX,0                ;ALREADY AT POS 1
  1193.         JE    GD_040
  1194.         MOV    AL,COLOR_4
  1195.         MOV    CUR_COLOR_1,AL
  1196.         MOV    AL,COLOR_5
  1197.         MOV    CUR_COLOR_2,AL
  1198.         CALL    BACKSPACE
  1199.         JMP    GD_030
  1200. GD_040:        CALL    BEEP
  1201.         JMP    GD_030
  1202. GD_045:        CMP    AL,0DH                ;ENTER
  1203.         JE    GD_060
  1204.         CMP    AL,' '                ;SPACE
  1205.         JNE    GD_050
  1206.         MOV    AL,0
  1207. GD_050:        CMP    AL,'a'
  1208.         JB    GD_055
  1209.         CMP    AL,'z'
  1210.         JA    GD_050
  1211.         SUB    AL,' '
  1212. GD_055:        MOV    ES:[DI],AL
  1213.         MOV    DS:[SI],AL
  1214.         MOV    AH,COLOR_4
  1215.         INC    DI
  1216.         MOV    ES:[DI],AH
  1217.         MOV    AH,COLOR_5
  1218.         MOV    ES:[DI+2],AH
  1219.         INC    DI
  1220.         INC    SI
  1221.         INC    CX
  1222.         CMP    CX,34
  1223.         JE    GD_060
  1224.         JMP    GD_030
  1225. GD_060:        MOV    AH,COLOR_4
  1226.         MOV    ES:[DI+1],AH
  1227.         CMP    BYTE PTR DS:[SI-1],'\'
  1228.         JE    GD_065
  1229.         MOV    AL,'\'
  1230.         MOV    DS:[SI],AL
  1231.         INC    SI
  1232. GD_065:        MOV    DI,2154                       ;GET DSN
  1233.         MOV    CX,0
  1234.         MOV    AH,COLOR_5
  1235.         MOV    ES:[DI+1],AH
  1236. GD_070:        MOV    AH,0
  1237.         INT    16H
  1238.         CMP    AH,01H                ;ESCAPE
  1239.         JNE    GD_075
  1240.         RET
  1241. GD_075:        CMP    AL,08H                ;BACKSPACE
  1242.         JNE    GD_085
  1243.         CMP    CX,0                ;AT POSITION 1
  1244.         JE    GD_080
  1245.         MOV    AL,COLOR_4
  1246.         MOV    CUR_COLOR_1,AL
  1247.         MOV    AL,COLOR_5
  1248.         MOV    CUR_COLOR_2,AL
  1249.         CALL    BACKSPACE
  1250.         JMP    GD_070
  1251. GD_080:        CALL    BEEP
  1252.         JMP    GD_070
  1253. GD_085:        CMP    AL,0DH                ;ENTER
  1254.         JNE    GD_090
  1255.         MOV    AH,00H
  1256.         RET
  1257. GD_090:        CMP    AL,'a'
  1258.         JB    GD_095
  1259.         CMP    AL,'z'
  1260.         JA    GD_095
  1261.         SUB    AL,' '
  1262. GD_095:        CMP    CX,12
  1263.         JE    GD_105
  1264.         INC    CX
  1265.         MOV    DS:[SI],AL
  1266.         INC    SI
  1267. GD_100:        MOV    ES:[DI],AL
  1268.         INC    DI
  1269.         MOV    AH,COLOR_4
  1270.         MOV    ES:[DI],AH
  1271.         JE    GD_105
  1272.         MOV    AH,COLOR_5
  1273.         MOV    ES:[DI+2],AH
  1274.         INC    DI
  1275.         JMP    GD_070
  1276. GD_105:        CALL    BEEP
  1277.         JMP    GD_070
  1278. GET_DSN        ENDP
  1279.  
  1280. PAGE_FORMAT    PROC    NEAR
  1281.         MOV    WINDOW_BUMP,100
  1282.         MOV    AL,COLOR_6
  1283.         MOV    WINDOW_COLOR,AL
  1284.         MOV    WINDOW_LINES,12
  1285.         MOV    AX,OFFSET WINDOW_4
  1286.         MOV    WINDOW_NUMBER,AX
  1287.         MOV    WINDOW_START,1180
  1288.         MOV    WINDOW_WIDTH,30
  1289.         CALL    DISPLAY_WINDOW
  1290. PF_005:        MOV    AH,0
  1291.         INT    16H
  1292.         CMP    AH,01H                       ;ESCAPE
  1293.         JNE    PF_010
  1294.         CALL    DISPLAY_WIN_1
  1295.         RET
  1296. PF_010:        CMP    AL,'a'
  1297.         JB    PF_015
  1298.         CMP    AL,'z'
  1299.         JA    PF_015
  1300.         SUB    AL,' '
  1301. PF_015:        CMP    AL,'A'                ;RESET PRINTER REQUEST
  1302.         JNE    PF_030
  1303.         MOV    AH,COLOR_7
  1304.         CALL    V_TRACE
  1305.         MOV    BYTE PTR ES:[1507],AH
  1306.         LEA    SI,RESET_STRING
  1307. PF_020:        MOV    AL,BYTE PTR CS:[SI]
  1308.         CMP    AL,0FFH
  1309.         JE    PF_025
  1310.         CALL    PRINTER_PORT
  1311.         INC    SI
  1312.         JMP    SHORT PF_020
  1313. PF_025:        JMP    PF_005
  1314. PF_030:        CMP    AL,'B'                       ;TOP OF FORM REQUEST
  1315.         JNE    PF_035
  1316.         MOV    AH,COLOR_7
  1317.         CALL    V_TRACE
  1318.         MOV    BYTE PTR ES:[1667],AH
  1319.         MOV    AL,27
  1320.         CALL    PRINTER_PORT
  1321.         MOV    AL,4
  1322.         CALL    PRINTER_PORT
  1323.         JMP    PF_005
  1324. PF_035:        MOV    FONT_TYPE,AL            ;SAVE REQUEST TYPE
  1325.         CMP    AL,'C'                ;FORM LENGTH IN INCHES
  1326.         JE    PF_040
  1327.         JMP    PF_115
  1328. PF_040:        MOV    AL,'_'
  1329.         MOV    AH,COLOR_7
  1330.         CALL    V_TRACE
  1331.         MOV    BYTE PTR ES:[2486],AL
  1332.         MOV    BYTE PTR ES:[2488],AL
  1333.         MOV    BYTE PTR ES:[2490],AL
  1334.         MOV    DI,1827
  1335.         CMP    FONT_TYPE,'C'
  1336.         JE    PF_045
  1337.         MOV    DI,1987
  1338. PF_045:        MOV    BYTE PTR ES:[DI],AH
  1339.         MOV    BYTE PTR ES:[2487],AH
  1340.         MOV    DI,2486
  1341.         MOV    SI,OFFSET FORMS_BUFFER
  1342.         MOV    CX,0
  1343. PF_050:        MOV    AH,0
  1344.         INT    16H
  1345.         CMP    AL,08H
  1346.         JNE    PF_055
  1347.         CMP    CX,0
  1348.         JE    PF_070
  1349.         MOV    AL,COLOR_6
  1350.         MOV    CUR_COLOR_1,AL
  1351.         MOV    AL,COLOR_7
  1352.         MOV    CUR_COLOR_2,AL
  1353.         CALL    BACKSPACE
  1354.         JMP    PF_050
  1355. PF_055:        CMP    AH,01H
  1356.         JNE    PF_060
  1357.         MOV    AL,' '
  1358.         CALL    V_TRACE
  1359.         MOV    BYTE PTR ES:[2486],AL
  1360.         MOV    BYTE PTR ES:[2488],AL
  1361.         MOV    BYTE PTR ES:[2490],AL
  1362.         MOV    AL,0
  1363.         MOV    FORMS_BUFFER[0],AL
  1364.         MOV    FORMS_BUFFER[1],AL
  1365.         MOV    FORMS_BUFFER[2],AL
  1366.         JMP    PF_005
  1367. PF_060:        CMP    AL,0DH
  1368.         JNE    PF_065
  1369.         JMP    PF_080
  1370. PF_065:        CMP    AL,'0'
  1371.         JB    PF_070
  1372.         CMP    AL,'9'
  1373.         JA    PF_070
  1374.         JMP    PF_075
  1375. PF_070:        CALL    BEEP
  1376.         JMP    PF_050
  1377. PF_075:        CALL    V_TRACE
  1378.         MOV    BYTE PTR ES:[DI],AL
  1379.         MOV    BYTE PTR DS:[SI],AL
  1380.         ADD    DI,2
  1381.         INC    SI
  1382.         INC    CX
  1383.         CMP    CX,3
  1384.         JE    PF_080
  1385.         JMP    PF_050
  1386. PF_080:        MOV    AX,0
  1387.         MOV    SI,OFFSET FORMS_BUFFER
  1388.         CMP    CX,3
  1389.         JB    PF_085
  1390.         MOV    DL,100
  1391.         MOV    AL,CS:[SI]
  1392.         SUB    AL,'0'
  1393.         MUL    DL
  1394.         INC    SI
  1395. PF_085:        PUSH    AX
  1396.         CMP    CX,2
  1397.         JB    PF_090
  1398.         MOV    DL,10
  1399.         MOV    AL,CS:[SI]
  1400.         SUB    AL,'0'
  1401.         MUL    DL
  1402.         XCHG    AX,BX
  1403.         POP    AX
  1404.         ADD    AX,BX
  1405.         PUSH    AX
  1406.         INC    SI
  1407. PF_090:        POP    AX
  1408.         MOV    BH,0
  1409.         MOV    BL,CS:[SI]
  1410.         SUB    BL,'0'
  1411.         ADD    AX,BX
  1412.         CMP    AX,256
  1413.         JB    PF_100
  1414.         CALL    BEEP
  1415.         MOV    AH,COLOR_6
  1416.         MOV    DI,1827
  1417.         CMP    FONT_TYPE,'C'
  1418.         JE    PF_095
  1419.         MOV    DI,1987
  1420. PF_095:        CALL    V_TRACE
  1421.         MOV    BYTE PTR ES:[DI],AH
  1422.         JMP    PF_110
  1423. PF_100:        XCHG    AX,BX
  1424.         MOV    AL,27
  1425.         CALL    PRINTER_PORT
  1426.         MOV    AL,'C'
  1427.         CALL    PRINTER_PORT
  1428.         CMP    FONT_TYPE,'D'
  1429.         JE    PF_105
  1430.         MOV    AL,0
  1431.         CALL    PRINTER_PORT
  1432. PF_105:        XCHG    AX,BX
  1433.         CALL    PRINTER_PORT
  1434. PF_110:        MOV    AL,' '
  1435.         MOV    AH,COLOR_6
  1436.         CALL    V_TRACE
  1437.         MOV    BYTE PTR ES:[2486],AL
  1438.         MOV    BYTE PTR ES:[2487],AH
  1439.         MOV    BYTE PTR ES:[2488],AL
  1440.         MOV    BYTE PTR ES:[2489],AH
  1441.         MOV    BYTE PTR ES:[2490],AL
  1442.         MOV    BYTE PTR ES:[2491],AH
  1443.         JMP    PF_005
  1444. PF_115:        CMP    AL,'D'                       ;FORM LENGTH IN LINES
  1445.         JNE    PF_120
  1446.         JMP    PF_040
  1447. PF_120:        CMP    AL,'E'
  1448.         JE    PF_125
  1449.         CALL    BEEP
  1450.         JMP    PF_005
  1451.  
  1452. PF_125:        MOV    AX,CS                ;FILL RETURN ADDRESS
  1453.         MOV    ES,AX
  1454.         MOV    CX,4
  1455.         LEA    SI,RETURN_ADDRESS
  1456.         MOV    DI,OFFSET WINDOW_6 + 76
  1457. PF_130:        PUSH    CX
  1458.         MOV    CX,33
  1459.         REP    MOVSB
  1460.         ADD    DI,4
  1461.         POP    CX
  1462.         LOOP    PF_130
  1463.  
  1464.         MOV    DI,OFFSET WINDOW_6+108        ;PUT _ IN ADDRESS
  1465.         MOV    CX,4
  1466. PF_135:        PUSH    DI
  1467.         PUSH    CX
  1468.         MOV    CX,33
  1469. PF_140:        MOV    AL,BYTE PTR ES:[DI]
  1470.         CMP    AL,00H
  1471.         JE    PF_145
  1472.         CMP    AL,' '
  1473.         JNE    PF_150
  1474. PF_145:        MOV    AL,5FH
  1475.         MOV    BYTE PTR ES:[DI],AL
  1476.         DEC    DI
  1477.         LOOP    PF_140
  1478. PF_150:        POP    CX
  1479.         POP    DI
  1480.         ADD    DI,37
  1481.         LOOP    PF_135
  1482.  
  1483.         LEA    DI,BUFFER            ;CLEAR WORK BUFFER
  1484.         LEA    SI,RETURN_ADDRESS
  1485.         MOV    CX,132
  1486. PF_155:        MOV    AL,DS:[SI]
  1487.         CMP    AL,'_'
  1488.         JNE    PF_160
  1489.         MOV    AL,' '
  1490. PF_160:        MOV    ES:[DI],AL
  1491.         INC    DI
  1492.         INC    SI
  1493.         LOOP    PF_155
  1494.         MOV    AL,' '                ;BLANK MAILING ADDRESS
  1495.         MOV    CX,132
  1496.         REP    STOSB
  1497.  
  1498.         LEA    SI,WINDOW_6B            ;RETURN ADDRESS INPUT
  1499.         LEA    DI,WINDOW_6+12
  1500.         MOV    CX,15
  1501.         REP    MOVSB
  1502.         LEA    SI,WINDOW_6D
  1503.         LEA    DI,WINDOW_6A+2
  1504.         MOV    CX,21
  1505.         REP    MOVSB
  1506.         MOV    WINDOW_BUMP,86
  1507.         MOV    AL,COLOR_3
  1508.         MOV    WINDOW_COLOR,AL
  1509.         MOV    WINDOW_LINES,9
  1510.         MOV    AX,OFFSET WINDOW_6
  1511.         MOV    WINDOW_NUMBER,AX
  1512.         MOV    WINDOW_START,668
  1513.         MOV    WINDOW_WIDTH,37
  1514.         CALL    DISPLAY_WINDOW
  1515.         MOV    AL,COLOR_3
  1516.         MOV    CUR_COLOR_1,AL
  1517.         MOV    CUR_COLOR_2,0F4H
  1518.         LEA    SI,BUFFER
  1519.         MOV    DI,992
  1520.         MOV    CX,0
  1521.         MOV    LINE,1
  1522.         CALL    V_TRACE
  1523.         MOV    AL,CUR_COLOR_2
  1524.         MOV    BYTE PTR ES:[DI+1],AL
  1525.         CALL    ENVELOPE
  1526.         CMP    AH,01H
  1527.         JNE    PF_165
  1528.         JMP    PF_265
  1529.  
  1530. PF_165:        MOV    AX,CS
  1531.         MOV    ES,AX
  1532.         LEA    SI,BUFFER            ;SAVE RETURN
  1533.         LEA    DI,RETURN_ADDRESS
  1534.         MOV    CX,4
  1535. PF_170:        PUSH    CX
  1536.         PUSH    DI
  1537.         PUSH    SI
  1538.         MOV    CX,33
  1539. PF_175:        CMP    BYTE PTR DS:[SI],' '
  1540.         JNE    PF_180
  1541.         INC    SI
  1542.         LOOP    PF_175
  1543.         JMP    PF_185
  1544. PF_180:        POP    SI
  1545.         PUSH    SI
  1546.         MOV    CX,33
  1547.         REP    MOVSB
  1548. PF_185:        POP    SI
  1549.         POP    DI
  1550.         POP    CX
  1551.         ADD    SI,33
  1552.         ADD    DI,33
  1553.         LOOP    PF_170
  1554.         LEA    DI,WINDOW_6 + 76        ;CLEAR WINDOW 6
  1555.         MOV    CX,4
  1556.         MOV    AL,'_'
  1557. PF_190:        PUSH    CX
  1558.         MOV    CX,33
  1559.         REP    STOSB
  1560.         POP    CX
  1561.         ADD    DI,4
  1562.         LOOP    PF_190
  1563.  
  1564.         LEA    SI,WINDOW_6C            ;MAILING ADDRESS INPUT
  1565.         LEA    DI,WINDOW_6+12
  1566.         MOV    CX,15
  1567.         REP    MOVSB
  1568.         MOV    WINDOW_BUMP,86
  1569.         MOV    AL,COLOR_4
  1570.         MOV    WINDOW_COLOR,AL
  1571.         MOV    WINDOW_LINES,9
  1572.         MOV    AX,OFFSET WINDOW_6
  1573.         MOV    WINDOW_NUMBER,AX
  1574.         MOV    WINDOW_START,1654
  1575.         MOV    WINDOW_WIDTH,37
  1576.         CALL    DISPLAY_WINDOW
  1577.         MOV    AL,COLOR_4
  1578.         MOV    CUR_COLOR_1,AL
  1579.         MOV    CUR_COLOR_2,0F2H
  1580.         LEA    SI,BUFFER+132
  1581.         MOV    DI,1978
  1582.         MOV    CX,0
  1583.         MOV    LINE,1
  1584.         CALL    V_TRACE
  1585.         MOV    AL,CUR_COLOR_2
  1586.         MOV    BYTE PTR ES:[DI+1],AL
  1587.         CALL    ENVELOPE
  1588.         CMP    AH,01H
  1589.         JNE    PF_195
  1590.         JMP    PF_265
  1591. PF_195:        LEA    SI,WINDOW_6E
  1592.         MOV    DI,2778
  1593.         MOV    CX,21
  1594.         CALL    V_TRACE
  1595. PF_200:        MOV    AL,BYTE PTR DS:[SI]
  1596.         MOV    BYTE PTR ES:[DI],AL
  1597.         ADD    DI,2
  1598.         INC    SI
  1599.         LOOP    PF_200
  1600. PF_205:        MOV    AH,0
  1601.         INT    16H
  1602.         CMP    AH,01H                       ;ESCAPE
  1603.         JNE    PF_210
  1604.         JMP    PF_265
  1605. PF_210:        CMP    AH,3BH                ;F1 = STANDARD SIZE
  1606.         JE    PF_215
  1607.         CMP    AH,3CH                ;F2 = LEGAL SIZE
  1608.         JE    PF_215
  1609.         CALL    BEEP
  1610.         JMP    PF_205
  1611. PF_215:        MOV    DX,AX                ;SAVE SIZE
  1612.         MOV    AL,0DH                ;JUMP DOWN FIVE LINES
  1613.         CALL    PRINTER_PORT
  1614.         MOV    CX,5
  1615. PF_220:        MOV    AL,0AH
  1616.         CALL    PRINTER_PORT
  1617.         LOOP    PF_220
  1618.         LEA    SI,BUFFER            ;ADDRESS BUFFER
  1619.         MOV    CX,8
  1620. PF_225:        PUSH    CX
  1621.         CMP    CX,4                ;BLANK MIDDLE LINES ?
  1622.         JNE    PF_235
  1623.         PUSH    CX
  1624.         MOV    CX,8
  1625. PF_230:        MOV    AL,0AH
  1626.         CALL    PRINTER_PORT
  1627.         LOOP    PF_230
  1628.         POP    CX
  1629. PF_235:        CMP    CX,4                       ;RETURN OR MAILING ?
  1630.         JA    PF_250
  1631.         CMP    DH,3BH                ;WHAT SIZE ?
  1632.         JE    PF_240
  1633.         MOV    CX,46                ;LEGAL SIZE INDENT
  1634.         JMP    PF_245
  1635. PF_240:        MOV    CX,25                ;STANDARD SIZE
  1636. PF_245:        MOV    AL,' '
  1637.         CALL    PRINTER_PORT
  1638.         LOOP    PF_245
  1639. PF_250:        MOV    CX,33
  1640. PF_255:        MOV    AL,BYTE PTR DS:[SI]        ;PRINT THE LINE
  1641.         CALL    PRINTER_PORT
  1642.         INC    SI
  1643.         LOOP    PF_255
  1644.         MOV    AL,0DH                ;MOVE TO NEXT LINE
  1645.         CALL    PRINTER_PORT
  1646.         MOV    AL,0AH
  1647.         CALL    PRINTER_PORT
  1648.         POP    CX
  1649.         LOOP    PF_225
  1650.         MOV    AL,0DH                ;PUT CARRIAGE BACK
  1651.         CALL    PRINTER_PORT
  1652.         MOV    CX,10                ;PUSH OUT ENVELOPE
  1653. PF_260:        MOV    AL,0AH
  1654.         CALL    PRINTER_PORT
  1655.         LOOP    PF_260
  1656. PF_265:        CALL    DISPLAY_WIN_1
  1657.         RET
  1658. PAGE_FORMAT    ENDP
  1659.  
  1660. PRINTER_PORT    PROC    NEAR
  1661.         PUSH    DX
  1662.         MOV    DX,ACTIVE_PRINTER
  1663.         OUT    DX,AL
  1664.         INC    DX
  1665. PRINTER_BUSY:    IN    AL,DX
  1666.         TEST    AL,80H
  1667.         JZ    PRINTER_BUSY
  1668.         INC    DX
  1669.         MOV    AL,0DH
  1670.         OUT    DX,AL
  1671.         MOV    AL,0CH
  1672.         OUT    DX,AL
  1673.         POP    DX
  1674.         RET
  1675. PRINTER_PORT    ENDP
  1676.  
  1677. SAVE_FONT    PROC    NEAR
  1678.         MOV    DI,1174
  1679.         LEA    SI,FONT_CHARACTER
  1680.         MOV    CX,11
  1681. SF_005:        PUSH    CX
  1682.         PUSH    DI
  1683.         MOV    CX,8
  1684.         MOV    BL,10000000B
  1685.         MOV    AL,00H
  1686.         CALL    V_TRACE
  1687. SF_010:        MOV    AH,BYTE PTR ES:[DI]
  1688.         CMP    AH,32
  1689.         JE    SF_015
  1690.         ADD    AL,BL
  1691. SF_015:        SHR    BL,1
  1692.         ADD    DI,160
  1693.         LOOP    SF_010
  1694.         MOV    BYTE PTR DS:[SI],AL
  1695.         POP    DI
  1696.         POP    CX
  1697.         INC    SI
  1698.         ADD    DI,2
  1699.         LOOP    SF_005
  1700.         RET
  1701. SAVE_FONT    ENDP
  1702.  
  1703. SEND_PRINTER    PROC    NEAR
  1704.         MOV    AX,SCREEN_ADDRESS
  1705.         MOV    ES,AX
  1706.         PUSH    SI
  1707.         MOV    BX,WORD PTR CS:[SI+3]
  1708.         CALL    V_TRACE
  1709.         MOV    AH,COLOR_2
  1710.         MOV    ES:[BX],AH             ;SET HIGHLIGHT
  1711. SP_005:        MOV    AL,CS:[SI]
  1712.         CALL    PRINTER_PORT            ;SEND ESC STRING
  1713.         INC    SI
  1714.         LOOP    SP_005
  1715.         POP    SI
  1716.         ADD    SI,5
  1717.         MOV    AH,COLOR_1            ;RESET HIGHLIGHTS
  1718.         MOV    CX,5
  1719. SP_010:        MOV    BX,WORD PTR CS:[SI]
  1720.         CMP    BX,0000
  1721.         JE    SP_015
  1722.         CALL    V_TRACE
  1723.         MOV    ES:[BX],AH
  1724.         ADD    SI,2
  1725.         LOOP    SP_010
  1726. SP_015:        RET
  1727. SEND_PRINTER    ENDP
  1728.  
  1729. TW_BIN_LINE    PROC    NEAR                ;SHOW LINE NUMBER
  1730.         PUSH    DI
  1731.         MOV    DI,3982
  1732.         MOV    AL,ROW
  1733.         INC    AL
  1734.         MOV    AH,0
  1735.         MOV    DL,10
  1736.         DIV    DL
  1737.         ADD    AL,'0'
  1738.         CALL    V_TRACE
  1739.         MOV    BYTE PTR ES:[DI],AL
  1740.         SUB    AL,'0'
  1741.         MOV    AH,0
  1742.         MOV    DL,10
  1743.         MUL    DL
  1744.         MOV    AH,ROW
  1745.         INC    AH
  1746.         SUB    AH,AL
  1747.         ADD    AH,'0'
  1748.         MOV    BYTE PTR ES:[DI+2],AH
  1749.         MOV    DI,3996
  1750.         MOV    AL,COLUMN
  1751.         INC    AL
  1752.         MOV    AH,0
  1753.         MOV    DL,10
  1754.         DIV    DL
  1755.         ADD    AL,'0'
  1756.         CALL    V_TRACE
  1757.         MOV    BYTE PTR ES:[DI],AL
  1758.         SUB    AL,'0'
  1759.         MOV    AH,0
  1760.         MOV    DL,10
  1761.         MUL    DL
  1762.         MOV    AH,COLUMN
  1763.         INC    AH
  1764.         SUB    AH,AL
  1765.         ADD    AH,'0'
  1766.         MOV    BYTE PTR ES:[DI+2],AH
  1767.         POP    DI
  1768.         RET
  1769. TW_BIN_LINE    ENDP
  1770.  
  1771. TW_LINES    PROC    NEAR
  1772.         LEA    SI,TYPEWRITER_BUFF
  1773.         MOV    AL,ROW
  1774.         MOV    AH,0
  1775.         MOV    DL,80
  1776.         MUL    DL
  1777.         ADD    SI,AX
  1778.         MOV    DI,0
  1779.         MOV    AH,0EH                ;BLACK/YELLOW
  1780.         MOV    CX,24
  1781. TW_005:        PUSH    CX
  1782.         CALL    V_TRACE
  1783.         MOV    CX,80
  1784. TW_010:        MOV    AL,DS:[SI]
  1785.         MOV    WORD PTR ES:[DI],AX
  1786.         INC    SI
  1787.         INC    DI
  1788.         INC    DI
  1789.         LOOP    TW_010
  1790.         POP    CX
  1791.         LOOP    TW_005
  1792.         RET
  1793. TW_LINES    ENDP
  1794.  
  1795. TYPEWRITER    PROC    NEAR
  1796.         MOV    AX,SCREEN_ADDRESS
  1797.         MOV    ES,AX
  1798.         MOV    DI,3840
  1799.         MOV    AH,60H                ;YELLOW/BLACK
  1800.         MOV    CX,80
  1801.         LEA    SI,TYPEWRITER_MSG
  1802.         CALL    V_TRACE
  1803. TY_005:        MOV    AL,BYTE PTR DS:[SI]
  1804.         MOV    WORD PTR ES:[DI],AX
  1805.         INC    SI
  1806.         INC    DI
  1807.         INC    DI
  1808.         LOOP    TY_005
  1809.         MOV    ROW,0
  1810.         MOV    COLUMN,0
  1811.         MOV    AH,2
  1812.         MOV    DX,0
  1813.         MOV    BH,0
  1814.         INT    10H
  1815. TY_010:        CALL    TW_LINES
  1816.         CALL    TW_BIN_LINE
  1817. TY_015:        MOV    AH,0
  1818.         INT    16H
  1819.         CMP    AH,50H                       ;DOWN ARROW
  1820.         JNE    TY_020
  1821. TY_015X:    CMP    ROW,65
  1822.         JE    TY_015
  1823.         MOV    AH,3                ;GET CURSOR LOCATION
  1824.         MOV    BH,0
  1825.         INT    10H
  1826.         CMP    DH,23
  1827.         JE    TY_015A
  1828.         INC    DH                       ;MOVE CURSOR DOWN
  1829.         MOV    AH,2
  1830.         INT    10H
  1831.         INC    ROW
  1832.         CALL    TW_BIN_LINE
  1833.         JMP    TY_015
  1834. TY_015A:    CMP    ROW,65
  1835.         JE    TY_015
  1836.         INC    ROW
  1837. TY_015B:    MOV    AL,ROW
  1838.         PUSH    AX
  1839.         SUB    ROW,23
  1840.         CALL    TW_LINES
  1841.         POP    AX
  1842.         MOV    ROW,AL
  1843.         CALL    TW_BIN_LINE
  1844.         JMP    TY_015
  1845. TY_020:        CMP    AH,48H                ;UP ARROW
  1846.         JNE    TY_025
  1847.         CMP    ROW,0
  1848.         JE    TY_015
  1849.         MOV    AH,3
  1850.         MOV    BH,0
  1851.         INT    10H
  1852.         CMP    DH,0
  1853.         JE    TY_020A
  1854. TY_020X:    DEC    DH
  1855.         MOV    AH,2
  1856.         MOV    BH,0
  1857.         INT    10H
  1858.         DEC    ROW
  1859.         CALL    TW_BIN_LINE
  1860.         JMP    TY_015
  1861. TY_020A:    DEC    ROW
  1862.         JMP    TY_010
  1863. TY_025:        CMP    AH,47H                       ;HOME
  1864.         JNE    TY_030
  1865.         MOV    ROW,0
  1866.         MOV    COLUMN,0
  1867.         MOV    AH,2
  1868.         MOV    DX,0
  1869.         MOV    BH,0
  1870.         INT    10H
  1871.         JMP    TY_010
  1872. TY_030:        CMP    AH,4FH                ;END
  1873.         JNE    TY_035
  1874.         MOV    ROW,42
  1875.         MOV    COLUMN,0
  1876.         MOV    AH,2
  1877.         MOV    DX,0
  1878.         MOV    BH,0
  1879.         INT    10H
  1880.         JMP    TY_010
  1881. TY_035:        CMP    AH,49H                ;PAGE UP
  1882.         JNE    TY_045
  1883. TY_036:        MOV    AH,2
  1884.         MOV    DX,0
  1885.         MOV    BH,0
  1886.         INT    10H
  1887.         MOV    COLUMN,0
  1888.         CMP    ROW,24
  1889.         JB    TY_040
  1890.         SUB    ROW,24
  1891.         JMP    TY_010
  1892. TY_040:        MOV    ROW,0
  1893.         JMP    TY_010
  1894. TY_045:        CMP    AH,51H                ;PAGE DOWN
  1895.         JNE    TY_060
  1896.         MOV    AH,2
  1897.         MOV    DX,0
  1898.         MOV    BH,0
  1899.         INT    10H
  1900.         MOV    COLUMN,0
  1901.         CMP    ROW,42
  1902.         JB    TY_050
  1903.         MOV    ROW,42
  1904.         JMP    TY_010
  1905. TY_050:        ADD    ROW,24
  1906.         CMP    ROW,42
  1907.         JB    TY_055
  1908.         MOV    ROW,42
  1909. TY_055:        JMP    TY_010
  1910. TY_060:        CMP    AH,4DH                ;RIGHT ARROW
  1911.         JNE    TY_080
  1912. TY_060A:    MOV    AH,3
  1913.         MOV    BH,0
  1914.         INT    10H
  1915.         CMP    COLUMN,79
  1916.         JE    TY_065
  1917.         INC    DL
  1918.         MOV    AH,2
  1919.         INT    10H
  1920.         INC    COLUMN
  1921.         CALL    TW_BIN_LINE
  1922.         JMP    TY_015
  1923. TY_065:        CMP    ROW,65
  1924.         JNE    TY_070
  1925.         JMP    TY_015
  1926. TY_070:        CMP    DH,23
  1927.         JNE    TY_075
  1928.         MOV    AH,2
  1929.         MOV    DL,0
  1930.         MOV    BH,0
  1931.         INT    10H
  1932.         INC    ROW
  1933.         MOV    COLUMN,0
  1934.         JMP    TY_015B
  1935. TY_075:        MOV    DL,0
  1936.         INC    DH
  1937.         MOV    AH,2
  1938.         INT    10H
  1939.         INC    ROW
  1940.         MOV    COLUMN,0
  1941.         CALL    TW_BIN_LINE
  1942.         JMP    TY_015
  1943. TY_080:        CMP    AH,01H                ;ESCAPE
  1944.         JNE    TY_090
  1945.         JMP    TY_900
  1946. TY_090:        CMP    AH,1CH                ;CARRIAGE RETURN
  1947.         JNE    TY_095
  1948.         MOV    AH,3
  1949.         MOV    BH,0
  1950.         INT    10H
  1951.         MOV    DL,0
  1952.         MOV    AH,2
  1953.         MOV    BH,0
  1954.         INT    10H
  1955.         MOV    COLUMN,0
  1956.         CALL    TW_BIN_LINE
  1957.         JMP    TY_015X
  1958. TY_095:        CMP    AH,4BH                ;LEFT ARROW
  1959.         JE    TY_095A
  1960.         CMP    AH,0EH
  1961.         JE    TY_095A
  1962.         JMP    TY_115
  1963. TY_095A:    MOV    AH,3
  1964.         MOV    BH,0
  1965.         INT    10H
  1966.         CMP    COLUMN,0
  1967.         JE    TY_100
  1968.         DEC    DL
  1969.         MOV    AH,2
  1970.         INT    10H
  1971.         DEC    COLUMN
  1972.         CALL    TW_BIN_LINE
  1973.         JMP    TY_015
  1974. TY_100:        CMP    ROW,0
  1975.         JNE    TY_105
  1976.         JMP    TY_015
  1977. TY_105:        MOV    DL,79
  1978.         MOV    COLUMN,79
  1979.         JMP    TY_020X
  1980. TY_110:        MOV    DL,0
  1981.         DEC    DH
  1982.         MOV    AH,2
  1983.         INT    10H
  1984.         INC    ROW
  1985.         MOV    COLUMN,79
  1986.         CALL    TW_BIN_LINE
  1987.         JMP    TY_015
  1988. TY_115:        CMP    AH,53H                ;DELETE
  1989.         JNE    TY_118
  1990.         LEA    SI,TYPEWRITER_BUFF
  1991.         MOV    AL,ROW
  1992.         MOV    AH,0
  1993.         MOV    DL,80
  1994.         MUL    DL
  1995.         ADD    SI,AX
  1996.         PUSH    SI
  1997.         MOV    AL,COLUMN
  1998.         MOV    AH,0
  1999.         ADD    SI,AX
  2000.         MOV    CL,79
  2001.         SUB    CL,COLUMN
  2002.         MOV    CH,0
  2003.         CMP    CX,0
  2004.         JE    TY_116A
  2005. TY_116:        MOV    AL,BYTE PTR DS:[SI+1]
  2006.         MOV    BYTE PTR DS:[SI],AL
  2007.         INC    SI
  2008.         LOOP    TY_116
  2009. TY_116A:    MOV    BYTE PTR DS:[SI],' '
  2010.         POP    SI
  2011.         MOV    AH,3
  2012.         MOV    BH,0
  2013.         INT    10H
  2014.         MOV    AL,DH
  2015.         MOV    AH,0
  2016.         MOV    DL,160
  2017.         MUL    DL
  2018.         MOV    DI,AX
  2019.         MOV    CX,80
  2020.         MOV    AH,0EH
  2021.         CALL    V_TRACE
  2022. TY_117:        MOV    AL,BYTE PTR DS:[SI]
  2023.         MOV    BYTE PTR ES:[DI],AL
  2024.         INC    SI
  2025.         INC    DI
  2026.         INC    DI
  2027.         LOOP    TY_117
  2028.         JMP    TY_015
  2029. TY_118:        CMP    AH,52H                ;INSERT
  2030.         JNE    TY_119
  2031.         CMP    INSERT,' '
  2032.         JE    TY_118A
  2033.         MOV    INSERT,' '
  2034.         CALL    V_TRACE
  2035.         MOV    BYTE PTR ES:[3962],' '
  2036.         MOV    BYTE PTR ES:[3964],' '
  2037.         MOV    BYTE PTR ES:[3966],' '
  2038.         JMP    TY_015
  2039. TY_118A:    MOV    INSERT,'I'
  2040.         MOV    AL,INSERT
  2041.         CALL    V_TRACE
  2042.         MOV    BYTE PTR ES:[3962],'I'
  2043.         MOV    BYTE PTR ES:[3964],'N'
  2044.         MOV    BYTE PTR ES:[3966],'S'
  2045.         JMP    TY_015
  2046. TY_119:        CMP    AH,3CH                ;F2 - CLEAR
  2047.         JNE    TY_119A
  2048.         MOV    CX,2640
  2049.         MOV    AX,2020H
  2050.         LEA    SI,TYPEWRITER_BUFF
  2051. TY_119X:    MOV    WORD PTR DS:[SI],AX
  2052.         INC    SI
  2053.         INC    SI
  2054.         LOOP    TY_119X
  2055.         JMP    TY_036
  2056. TY_119A:    CMP    AH,3BH
  2057.         JNE    TY_119B
  2058.         LEA    SI,TYPEWRITER_BUFF
  2059.         MOV    CX,66
  2060. TY_119C:    PUSH    CX
  2061.         MOV    CX,80
  2062. TY_119D:    MOV    AL,BYTE PTR DS:[SI]
  2063.         CALL    PRINTER_PORT
  2064.         INC    SI
  2065.         LOOP    TY_119D
  2066.         MOV    AL,0DH
  2067.         CALL    PRINTER_PORT
  2068.         MOV    AL,0AH
  2069.         CALL    PRINTER_PORT
  2070.         POP    CX
  2071.         LOOP    TY_119C
  2072.         JMP    TY_015
  2073. TY_119B:    CMP    AL,0
  2074.         JNE    TY_120
  2075.         CALL    BEEP                ;UNKNOWN REQUEST
  2076.         JMP    TY_015
  2077. TY_120:        CMP    INSERT,'I'
  2078.         JE    TY_125
  2079.         PUSH    AX                ;DISPLAY CHARACTER
  2080.         MOV    AH,3
  2081.         MOV    BH,0
  2082.         INT    10H
  2083.         PUSH    DX
  2084.         MOV    AL,DH
  2085.         MOV    AH,0
  2086.         MOV    DL,160
  2087.         MUL    DL
  2088.         POP    DX
  2089.         PUSH    AX
  2090.         MOV    AL,DL
  2091.         MOV    AH,0
  2092.         MOV    DL,2
  2093.         MUL    DL
  2094.         POP    DI
  2095.         ADD    DI,AX
  2096.         POP    AX
  2097.         CALL    V_TRACE
  2098.         MOV    BYTE PTR ES:[DI],AL
  2099.         PUSH    AX
  2100.         LEA    SI,TYPEWRITER_BUFF
  2101.         MOV    AL,ROW
  2102.         MOV    AH,0
  2103.         MOV    DL,80
  2104.         MUL    DL
  2105.         ADD    SI,AX
  2106.         MOV    AL,COLUMN
  2107.         MOV    AH,0
  2108.         ADD    SI,AX
  2109.         POP    AX
  2110.         MOV    BYTE PTR DS:[SI],AL
  2111.         JMP    TY_060A
  2112. TY_125:        CMP    COLUMN,79
  2113.         JB    TY_126
  2114.         CALL    BEEP
  2115.         JMP    TY_015
  2116. TY_126:        PUSH    AX
  2117.         LEA    SI,TYPEWRITER_BUFF
  2118.         MOV    AL,ROW
  2119.         MOV    AH,0
  2120.         MOV    DL,80
  2121.         MUL    DL
  2122.         ADD    SI,AX
  2123.         ADD    SI,79
  2124.         MOV    CX,80
  2125.         SUB    CL,COLUMN
  2126.         DEC    CX
  2127. TY_130:        MOV    AL,BYTE PTR DS:[SI-1]
  2128.         MOV    BYTE PTR DS:[SI],AL
  2129.         DEC    SI
  2130.         LOOP    TY_130
  2131.         POP    AX
  2132.         MOV    BYTE PTR DS:[SI],AL
  2133.         LEA    SI,TYPEWRITER_BUFF
  2134.         MOV    AL,ROW
  2135.         MOV    AH,0
  2136.         MOV    DL,80
  2137.         MUL    DL
  2138.         ADD    SI,AX
  2139.         MOV    AH,3
  2140.         MOV    BH,0
  2141.         INT    10H
  2142.         MOV    AL,DH
  2143.         MOV    AH,0
  2144.         MOV    DL,160
  2145.         MUL    DL
  2146.         MOV    DI,AX
  2147.         MOV    CX,80
  2148.         MOV    AH,0EH
  2149.         CALL    V_TRACE
  2150. TY_135:        MOV    AL,BYTE PTR DS:[SI]
  2151.         MOV    BYTE PTR ES:[DI],AL
  2152.         INC    SI
  2153.         INC    DI
  2154.         INC    DI
  2155.         LOOP    TY_135
  2156.         JMP    TY_060A
  2157. TY_900:        CALL    DISPLAY_WIN_1
  2158.         MOV    AH,2
  2159.         MOV    DX,0
  2160.         MOV    BH,0
  2161.         INT    10H
  2162.         RET
  2163. TYPEWRITER    ENDP
  2164.  
  2165. V_TRACE        PROC    NEAR
  2166.         CMP    MONO,'Y'            ;HANDLE C/G ADAPTER
  2167.         JE    VT_010                ;SNOW
  2168.         PUSH    DX
  2169.         PUSH    AX
  2170.         MOV    DX,3DAH
  2171. VT_005:        IN    AX,DX
  2172.         AND    AX,8
  2173.         JZ    VT_005
  2174.         POP    AX
  2175.         POP    DX
  2176. VT_010:        RET
  2177. V_TRACE        ENDP
  2178.  
  2179. PROGRAM_END    LABEL    BYTE
  2180.  
  2181. ADDRESS_LOC    DW    0
  2182. ALREADY_MSG    DB    0DH,0AH,'PRO-SET ALREADY INSTALLED',0DH,0AH,'$'
  2183. INSTALL_MSG    DB    0DH,0AH,'PRO-SET 3.5 INSTALLED',0DH,0AH,'$'
  2184. NO_PARM_MSG    DB    0DH,0AH,'╔════════════════════════════════════════╗'
  2185.         DB    0DH,0AH,'║    ACTIVATE PRO-SET 3.5 AS FOLLOWS:    ║'
  2186.         DB    0DH,0AH,'║ PRO-SET  [R=x C=x V=x S=xx K=xx A=xxx] ║'
  2187.         DB    0DH,0AH,'║----------------------------------------║'
  2188.         DB    0DH,0AH,'║ R indicates Run Type:                  ║'
  2189.         DB    0DH,0AH,'║    x = "R" for Resident, "B" for Batch ║'
  2190.         DB    0DH,0AH,'║ C indicates Colors Wanted:             ║'
  2191.         DB    0DH,0AH,'║    x = "C" for Color, "M" for Mono     ║'
  2192.         DB    0DH,0AH,'║ V indicates Sound Wanted:              ║'
  2193.         DB    0DH,0AH,'║    x = "Y" for Yes "N" for No          ║'
  2194.         DB    0DH,0AH,'║ S indicates scan code of Hot-Key:      ║'
  2195.         DB    0DH,0AH,'║    xx = hexidecimal scan code          ║'
  2196.         DB    0DH,0AH,'║ K indicates the Shift/CTRL/ALT keys:   ║'
  2197.         DB    0DH,0AH,'║    xx = hexidecimal value of key combo ║'
  2198.         DB    0DH,0AH,'║ A indicates the Return Address DSN     ║'
  2199.         DB    0DH,0AH,'║   xxx = [Drive]:\[Path]\[Dataset Name] ║'
  2200.         DB    0DH,0AH,'║----------------------------------------║'
  2201.         DB    0DH,0AH,'║=> Defaults are R=R C=C V=Y S=19 K=0C <=║'
  2202.         DB    0DH,0AH,'╚════════════════════════════════════════╝'
  2203.         DB    0DH,0AH,0AH,'$'
  2204. PARMS        DB    'S=K=V=C=R=A='
  2205.  
  2206. HEX_BIN        PROC    NEAR
  2207.         MOV    DL,BYTE PTR DS:[SI+2]        ;CONVERT EXTERNAL HEX
  2208.         CMP    DL,'0'                ;TO INTERNAL BINARY
  2209.         JL    HB_025
  2210.         CMP    DL,'F'
  2211.         JA    HB_025
  2212.         CMP    DL,':'
  2213.         JL    HB_005
  2214.         CMP    DL,'A'
  2215.         JL    HB_025
  2216.         SUB    DL,07H
  2217. HB_005:        SUB    DL,30H
  2218.         CMP    DL,'9'
  2219.         JLE    HB_010
  2220.         DEC    DL
  2221. HB_010:        MOV    AL,DL
  2222.         MOV    DL,10H
  2223.         MUL    DL
  2224.         MOV    DL,BYTE PTR DS:[SI+3]
  2225.         CMP    DL,'0'
  2226.         JL    HB_025
  2227.         CMP    DL,'F'
  2228.         JA    HB_025
  2229.         CMP    DL,':'
  2230.         JL    HB_015
  2231.         CMP    DL,'A'
  2232.         JL    HB_025
  2233.         SUB    DL,07H
  2234. HB_015:        SUB    DL,30H
  2235.         CMP    DL,'9'
  2236.         JLE    HB_020
  2237.         DEC    DL
  2238. HB_020:        MOV    DH,0
  2239.         ADD    AX,DX
  2240.         JMP    HB_030
  2241. HB_025:        MOV    AX,0FFFFH
  2242. HB_030:        RET
  2243. HEX_BIN        ENDP
  2244.     
  2245. CHECK_CAPS    PROC    NEAR
  2246.         CMP    AL,'a'
  2247.         JB    CC_005
  2248.         CMP    AL,'z'
  2249.         JA    CC_005
  2250.         SUB    AL,' '
  2251. CC_005:        RET
  2252. CHECK_CAPS    ENDP
  2253.  
  2254. START:        MOV    AX,CS                ;LOCATE PARMS, IF ANY
  2255.         MOV    DS,AX
  2256.         MOV    SI,80H
  2257.         MOV    CH,0
  2258.         MOV    CL,BYTE PTR DS:[SI]
  2259.         INC    SI
  2260.         CMP    CX,0
  2261.         JNE    FIND_PARMS
  2262.  
  2263.         MOV    COLOR_REQUEST,'C'        ;SET DEFAULTS
  2264.         MOV    SOUND_STATUS,'Y'
  2265.         MOV    KBFLAG,0CH
  2266.         MOV    SCAN_CODE,19H
  2267.         MOV    RESIDENT,'R'
  2268.  
  2269.         JMP    MAKE_RESIDENT
  2270.  
  2271. PARM_ERROR:    PUSH    DS                ;SET UP NORMAL RETURN
  2272.         MOV    AX,0                ;STACK
  2273.         PUSH    AX
  2274.  
  2275.         PUSH    CS                ;TELL USER HE DID IT
  2276.         POP    DS                ;WRONG
  2277.         LEA    DX,NO_PARM_MSG
  2278.         MOV    AH,09H
  2279.         INT    21H
  2280.         CALL    BEEP
  2281.         RET
  2282.  
  2283. FIND_PARMS:    MOV    SI,81H
  2284.         MOV    CH,0
  2285.         MOV    CL,BYTE PTR DS:[80H]
  2286.  
  2287.         PUSH    CX
  2288.         PUSH    SI
  2289. CAPS_LOOP:    MOV    AL,DS:[SI]
  2290.         CALL    CHECK_CAPS
  2291.         MOV    DS:[SI],AL
  2292.         INC    SI
  2293.         LOOP    CAPS_LOOP
  2294.         POP    SI
  2295.         POP    CX
  2296.  
  2297. FIND_RESIDENT:    PUSH    CX
  2298.         PUSH    SI
  2299.         LEA    DI,PARMS+8
  2300.         MOV    CX,2
  2301.         REPZ    CMPSB
  2302.         JE    GOT_RESIDENT
  2303.         POP    SI
  2304.         POP    CX
  2305.         INC    SI
  2306.         LOOP    FIND_RESIDENT
  2307.         JMP    FIND_COLOR
  2308. GOT_RESIDENT:    POP    SI
  2309.         POP    CX
  2310.         MOV    RESIDENT,'B'
  2311.         CMP    BYTE PTR DS:[SI+2],'B'
  2312.         JE    FIND_COLOR
  2313.         MOV    RESIDENT,'R'
  2314.         CMP    BYTE PTR DS:[SI+2],'R'
  2315.         JE    FIND_COLOR
  2316.         JMP    PARM_ERROR
  2317.             
  2318. FIND_COLOR:    MOV    SI,81H
  2319.         MOV    CH,0
  2320.         MOV    CL,BYTE PTR DS:[80H]
  2321. FIND_COLOR_2:    PUSH    CX
  2322.         PUSH    SI
  2323.         LEA    DI,PARMS+6
  2324.         MOV    CX,2
  2325.         REPZ    CMPSB
  2326.         JE    GOT_COLOR
  2327.         POP    SI
  2328.         POP    CX
  2329.         INC    SI
  2330.         LOOP    FIND_COLOR_2
  2331.         JMP    FIND_SOUND
  2332. GOT_COLOR:    POP    SI
  2333.         POP    CX
  2334.         MOV    COLOR_REQUEST,'M'
  2335.         CMP    BYTE PTR DS:[SI+2],'M'
  2336.         JE    FIND_SOUND
  2337.         MOV    COLOR_REQUEST,'C'
  2338.         CMP    BYTE PTR DS:[SI+2],'C'
  2339.         JE    FIND_SOUND
  2340.         JMP    PARM_ERROR
  2341.  
  2342. FIND_SOUND:    MOV    SI,81H
  2343.         MOV    CH,0
  2344.         MOV    CL,BYTE PTR DS:[80H]
  2345. FIND_SOUND_2:    PUSH    CX
  2346.         PUSH    SI
  2347.         LEA    DI,PARMS+4
  2348.         MOV    CX,2
  2349.         REPZ    CMPSB
  2350.         JE    GOT_SOUND
  2351.         POP    SI
  2352.         POP    CX
  2353.         INC    SI
  2354.         LOOP    FIND_SOUND_2
  2355.         JMP    FIND_SCAN
  2356. GOT_SOUND:    POP    SI
  2357.         POP    CX
  2358.         MOV    SOUND_STATUS,'N'
  2359.         CMP    BYTE PTR DS:[SI+2],'N'
  2360.         JE    FIND_SCAN
  2361.         MOV    SOUND_STATUS,'Y'
  2362.         CMP    BYTE PTR DS:[SI+2],'Y'
  2363.         JE    FIND_SCAN
  2364.         JMP    PARM_ERROR
  2365.  
  2366. FIND_SCAN:    MOV    SI,81H
  2367.         MOV    CH,0
  2368.         MOV    CL,BYTE PTR DS:[80H]
  2369. FIND_SCAN_2:    PUSH    CX
  2370.         PUSH    SI
  2371.         LEA    DI,PARMS+2
  2372.         MOV    CX,2
  2373.         REPZ    CMPSB
  2374.         JE    GOT_SCAN
  2375.         POP    SI
  2376.         POP    CX
  2377.         INC    SI
  2378.         LOOP    FIND_SCAN_2
  2379.         JMP    FIND_KBFLAG
  2380. GOT_SCAN:    POP    SI
  2381.         POP    CX
  2382.         CALL    HEX_BIN
  2383.         CMP    AX,0FFFFH
  2384.         JNE    SCAN_OKAY
  2385.         JMP    PARM_ERROR
  2386. SCAN_OKAY:    MOV    SCAN_CODE,AL
  2387.  
  2388. FIND_KBFLAG:    MOV    SI,81H
  2389.         MOV    CH,0
  2390.         MOV    CL,BYTE PTR DS:[80H]
  2391. FIND_KBFLAG_2:    PUSH    CX
  2392.         PUSH    SI
  2393.         LEA    DI,PARMS
  2394.         MOV    CX,2
  2395.         REPZ    CMPSB
  2396.         JE    GOT_KBFLAG
  2397.         POP    SI
  2398.         POP    CX
  2399.         INC    SI
  2400.         LOOP    FIND_KBFLAG_2
  2401.         JMP    FIND_ADDRESS
  2402. GOT_KBFLAG:    POP    SI
  2403.         POP    CX
  2404.         CALL    HEX_BIN
  2405.         CMP    AX,0FFFFH
  2406.         JNE    KBFLAG_OKAY
  2407.         JMP    PARM_ERROR
  2408. KBFLAG_OKAY:    MOV    KBFLAG,AL
  2409.  
  2410. FIND_ADDRESS:    MOV    SI,81H
  2411.         MOV    CH,0
  2412.         MOV    CL,BYTE PTR DS:[80H]
  2413. FIND_ADDRESS_2:    PUSH    CX
  2414.         PUSH    SI
  2415.         LEA    DI,PARMS+10
  2416.         MOV    CX,2
  2417.         REPZ    CMPSB
  2418.         JE    GOT_ADDRESS
  2419.         POP    SI
  2420.         POP    CX
  2421.         INC    SI
  2422.         LOOP    FIND_ADDRESS_2
  2423.         JMP    PARMS_SET
  2424. GOT_ADDRESS:    POP    SI
  2425.         POP    CX
  2426.         MOV    BX,OFFSET ASCIIZ
  2427.         ADD    SI,2
  2428. GA_005:        MOV    AL,DS:[SI]
  2429.         CMP    AL,' '
  2430.         JE    GA_010
  2431.         CMP    AL,00H
  2432.         JE    GA_010
  2433.         CMP    AL,0DH
  2434.         JE    GA_010
  2435.         MOV    BYTE PTR DS:[BX],AL
  2436.         INC    BX
  2437.         INC    SI
  2438.         JMP    GA_005
  2439. GA_010:        MOV    AL,00H
  2440.         MOV    BYTE PTR DS:[BX],AL
  2441.         MOV    AH,3DH                ;OPEN ADDRESS FILE
  2442.         MOV    AL,00H
  2443.         LEA    DX,ASCIIZ
  2444.         INT    21H
  2445.         CMP    AX,2
  2446.         JE    GA_035
  2447.         CMP    AX,4
  2448.         JE    GA_035
  2449.         CMP    AX,12
  2450.         JE    GA_035
  2451.         MOV    DI,0
  2452.         MOV    LINE,1
  2453.         MOV    BX,AX
  2454.         LEA    DX,RETURN_ADDRESS
  2455.         MOV    ADDRESS_LOC,DX
  2456. GA_015:        MOV    CX,1                ;READ A BYTE
  2457.         MOV    AH,3FH
  2458.         INT    21H
  2459.         CMP    AX,0
  2460.         JE    GA_030
  2461.         CMP    DI,132
  2462.         JA    GA_030
  2463.         MOV    SI,DX
  2464.               CMP    BYTE PTR DS:[SI],0DH        ;CARRIAGE RETURN
  2465.         JE    GA_020
  2466.         CMP    BYTE PTR DS:[SI],0AH           ;LINE FEED
  2467.         JE    GA_025
  2468.         INC    DX
  2469.         INC    DI
  2470.         JMP    GA_015
  2471. GA_020:        MOV    BYTE PTR DS:[SI],5FH        ;BLANK CARRIAGE RETURN
  2472.         ADD    ADDRESS_LOC,33
  2473.         MOV    DX,ADDRESS_LOC
  2474.         INC    LINE
  2475.         CMP    LINE,5
  2476.         JE    GA_030
  2477.         JMP    GA_015
  2478. GA_025:        MOV    BYTE PTR DS:[SI],5FH        ;BLANK LINE FEED
  2479.         JMP    GA_015
  2480. GA_030:        MOV    AH,3EH                ;CLOSE FILE
  2481.         INT    21H
  2482.         JMP    PARMS_SET
  2483. GA_035:        JMP    PARM_ERROR
  2484.             
  2485. PARMS_SET:    CMP    COLOR_REQUEST,'C'
  2486.         JE    CHECK_RUN_TYPE
  2487.  
  2488.         MOV    COLOR_1,07H            ;SET TO MONOCHROME
  2489.         MOV    COLOR_2,0FH
  2490.         MOV    COLOR_3,07H
  2491.         MOV    COLOR_4,0FH
  2492.         MOV    COLOR_5,07H
  2493.         MOV    COLOR_6,0FH
  2494.         MOV    COLOR_7,07H
  2495.         MOV    COLOR_8,0FH
  2496.  
  2497. CHECK_RUN_TYPE:    CMP    RESIDENT,'R'            ;MAKE RESIDENT
  2498.         JE    MAKE_RESIDENT
  2499.  
  2500. BATCH_RUN:    PUSH    DS
  2501.         MOV    AX,0
  2502.         PUSH    AX
  2503.         JMP    KBOARD_MATCH
  2504.  
  2505. MAKE_RESIDENT:    PUSH    CS                ;PROGRAM LOADER
  2506.         POP    DS
  2507.         LEA    SI,LOAD_FLAG            ;SET FLAGS TO SEE IF
  2508.         MOV    BYTE PTR DS:[SI],'╗'           ;LOADED BEFORE
  2509.         MOV    BYTE PTR DS:[SI+1],'╝'
  2510.         MOV    BYTE PTR DS:[SI+2],'╜'
  2511.         MOV    AX,0
  2512.  
  2513. CHECK_LOADED:    MOV    ES,AX                ;LOADED BEFORE ?
  2514.         LEA    SI,LOAD_FLAG
  2515.         MOV    DI,SI
  2516.         MOV    CX,3
  2517.         REP    CMPSB
  2518.         JE    CHECK_EQUAL
  2519.         INC    AX
  2520.         JMP    SHORT CHECK_LOADED
  2521.  
  2522. CHECK_EQUAL:    MOV    AX,ES                ;IF ES AND DS SAME
  2523.         MOV    BX,DS                ;THEN NOT LOADED
  2524.         CMP    AX,BX
  2525.         JE    LOAD_IT
  2526.  
  2527.         LEA    DX,ALREADY_MSG            ;ALREADY RESIDENT
  2528.         MOV    AH,09H
  2529.         INT    21H
  2530.         CALL    BEEP
  2531.         RET
  2532.  
  2533. LOAD_IT:    LEA    DX,INSTALL_MSG            ;INSTALLATION MESSAGE
  2534.         MOV    AH,09H
  2535.         INT    21H
  2536.  
  2537.         MOV    AX,3509H            ;GET OLD VECTOR ADDR
  2538.         INT    21H
  2539.         MOV    WORD PTR CS:[KBOARD_VECTOR],BX
  2540.         MOV    WORD PTR CS:[KBOARD_VECTOR+2],ES
  2541.  
  2542.         LEA    DX,KBOARD_HANDLER        ;SET NEW VECTOR
  2543.         MOV    AX,2509H
  2544.         INT    21H
  2545.  
  2546.         MOV    DX,OFFSET PROGRAM_END+1        ;LOAD & STAY
  2547.         INT    27H
  2548.  
  2549. CODE        ENDS
  2550.  
  2551.         END    PROSET
  2552.